2017-11-18 322 views
1

我有这样的代码,是应该打印一个字符串的第一个字母:空的结束改变了串

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 
+3

这不是[MCVE]。你很可能将您的字符串放入代码路径中。更多的人这样做比我想象的要多。另外,学会使用bochs调试器。 – Jester

+0

@Jester我加了整个代码。它基本上没有区别,因为它几乎是我的整个代码。是的,任何事情都可能我不是专业人士,所以这可能是愚蠢的。我正在学习如何使用它。 – Maineri

+2

btw,在开始时使用'[org 0x7c00]'来避免必须通过'add bx,0x7c00' ...来调整偏移量...(但是即使这样也只能用于更常见的BIOS,因为一些罕见的将不会从' 0000:7C00',但其他东西像'07C0:0000',所以从'cs'复制的'ds'将会出错......等等,你根本就没有设置ds,这是另一个主要问题,你很幸运,Bochs是如此“自然”的环境,在寄存器中启动你的启动加载器,并具有常识值。编写*鲁棒性*引导程序相当棘手。 – Ped7g

回答

1

这就像@Jester猜测。您执行message,因为它是代码。代码执行从mov ah, 0x0e开始,然后直接跟在它后面的字节,即字符串'Booting MainOPS', 0,然后是printTheMessage代码。

要么将​​message移动到无限循环后,要么在第一条指令后面添加jmpprintTheMessage

+0

哦,我明白了......谢谢! – Maineri