gpt4 book ai didi

assembly - 引导加载程序中的 Masm 字符串变量导致 : Undefined symbol error

转载 作者:行者123 更新时间:2023-12-05 03:17:20 26 4
gpt4 key购买 nike

由于我无法确定的原因,在我的引导加载程序中使用变量会导致它被标记为 undefined symbol 。

.386
option segment:use16
.model tiny, stdcall

;------------------------------
; CODE
;------------------------------
.code
org 07c00h

Print PROTO lpStr:WORD

_start:
INVOKE Print, OFFSET bootInfo
cli
hlt

error:
cli
hlt

Print PROC USES ax si lpStr:WORD
mov si, lpStr
mov ah, 0Eh
@@loop:
lodsb
cmp al, 0
je @@done
int 10h
jmp @@loop
@@done:
ret
Print ENDP

;------------------------------
; DATA
;------------------------------
bootInfo db "Booting CompatOS...", 0

;------------------------------
; PADDING
;------------------------------
byte 510-($-_start) dup (0)
dw 0AA55h

END _start

我搜索并查看了我声明变量的方式是否有问题,但显然,它应该像这样工作。对于上下文,我将自己定位于 this .

非常感谢任何帮助。谢谢。

编辑:

MASM and linker用于编译源代码。生成文件:

.PHONY: clear
clear:
rm -f -r -d ./tmp/
rm -f -r -d ./bin/

.PHONY: build_debug
build_debug:
mkdir -p tmp
mkdir -p bin
masm_615/bin/ml /nologo /AT /c /Febin\\CompatOS.img /Fotmp\\boot.obj src\\boot\\boot.asm
masm_615/bin/link /nologo /TINY /NOD tmp\\boot.obj, bin\\CompatOS.img, NUL, NUL, NUL

错误:

1>src\boot\boot.asm(14): error A2006: undefined symbol : bootInfo
1>src\boot\boot.asm(14): error A2114: INVOKE argument type mismatch : argument : 1

最佳答案

错误是因为您正在使用带有前向引用的 invoke 指令。 bootInfo 在您使用 invoke 后声明。该问题已在 MASM32 forum 上讨论过.解决此问题的一种方法是不使用 invoke 并执行 call。这将需要您自己将 bootInfo 的地址压入堆栈,如下所示:

;   INVOKE Print, OFFSET bootInfo
mov ax, OFFSET bootInfo
push ax ; Push register since original 8086
; didn't have a push IMMediate instruction
call Print

另一个编码选项是将数据移动到引导加载程序的开头附近,引导加载程序的第一条指令会跳过数据到代码。这会将 bootInfo 放在 invoke 之前,您将不再有前向引用。像这样:

;------------------------------
; CODE
;------------------------------
.code
org 07c00h

Print PROTO lpStr:WORD

_start:
jmp skipdata
;------------------------------
; DATA
;------------------------------
bootInfo db "Booting CompatOS...", 0

skipdata:
INVOKE Print, OFFSET bootInfo
cli
hlt

解决这个问题的另一种方法是使用 JWASM (一个开源的 MASM 兼容汇编程序)。我注意到 JWASM 在使用 invoke 时没有前向引用问题。


注意事项

  • 我知道你有点受限,因为这是一个引导加载程序,你不能只将 bootInfo 放在 .data 部分并将其放在 .code 部分,这将是一个可以在引导加载程序之外工作的解决方案。您需要一个能够将代码正确放置在数据(或被代码包围的数据)之前的解决方案,然后是 512 字节扇区末尾的引导签名 0xaa55。

  • 我建议看一下我的 bootloader tips用于开发引导加载程序时的常见问题,包括在真实硬件上进行测试时的建议。

  • 如果您打算在可能早于 386 的真实硬件上运行,您可能希望使用 .8086 指令而不是 .386。遗留引导加载程序是通常在开发时考虑到最低公分母 - 8086 处理器。如果您不打算在旧硬件上运行,那么这可能不是问题。

关于assembly - 引导加载程序中的 Masm 字符串变量导致 : Undefined symbol error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74150412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com