空终止会更改字符串

时间:2017-11-18 12:31:21

标签: assembly x86 nasm

我有这个代码打算打印字符串的第一个字母:

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中作为bootsector运行。

**编辑

完整代码:

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

1 个答案:

答案 0 :(得分:1)

正如@Jester所猜测的那样。您执行message,因为它是代码。代码执行从mov ah, 0x0e开始,然后它继续直接跟随它的字节,即字符串'Booting MainOPS', 0,然后它跟随printTheMessage代码。

message移至无限循环之后,或在第一条指令之后将jmp添加到printTheMessage