空的结束改变了串
问题描述:
我有这样的代码,是应该打印一个字符串的第一个字母:空的结束改变了串
mov bx, message ; Move the address of the message to bx
add bx, 0x7c00 ; Adding the padding of bootsector to bx
mov al, [bx] ; Move the value at the address in bx to al
int 0x10 ; Interrupt drawing the character in al to screen
为什么不这项工作:
message:
db "Test", 0
但这个工程:
message:
db "Test", 0, 0
第一个打印一些随机字符,第二个总是我的消息的第一个字母。
该代码与NASM一起编译到.bin中,并作为Bochs中的引导扇区运行。
**编辑
全码:
mov ah, 0x0e
message:
db 'Booting MainOPS', 0
printTheMessage:
mov bx, message
add bx, 0x7c00
mov al, [bx]
int 0x10
jmp $
times 510 - ($-$$) db 0
dw 0xaa55
答
这就像@Jester猜测。您执行message
,因为它是代码。代码执行从mov ah, 0x0e
开始,然后直接跟在它后面的字节,即字符串'Booting MainOPS', 0
,然后是printTheMessage
代码。
要么将message
移动到无限循环后,要么在第一条指令后面添加jmp
到printTheMessage
。
+0
哦,我明白了......谢谢! – Maineri
这不是[MCVE]。你很可能将您的字符串放入代码路径中。更多的人这样做比我想象的要多。另外,学会使用bochs调试器。 – Jester
@Jester我加了整个代码。它基本上没有区别,因为它几乎是我的整个代码。是的,任何事情都可能我不是专业人士,所以这可能是愚蠢的。我正在学习如何使用它。 – Maineri
btw,在开始时使用'[org 0x7c00]'来避免必须通过'add bx,0x7c00' ...来调整偏移量...(但是即使这样也只能用于更常见的BIOS,因为一些罕见的将不会从' 0000:7C00',但其他东西像'07C0:0000',所以从'cs'复制的'ds'将会出错......等等,你根本就没有设置ds,这是另一个主要问题,你很幸运,Bochs是如此“自然”的环境,在寄存器中启动你的启动加载器,并具有常识值。编写*鲁棒性*引导程序相当棘手。 – Ped7g