我为NASM汇编程序编写了以下x86汇编代码。
你好.asm
[org 0x7c00]
mov bx, HELLO_MSG
call print_string
mov bx, GOODBYE_MSG
call print_string
jmp $
%include "print_string.asm"
HELLO_MSG:
db 'hello, world',0
GOODBYE_MSG:
db 'good bye',0
times 510-($-$$) db 0
dw 0xaa55
print_string.asm
print_string:
mov ah, 0x0e
push bx
loop:
cmp WORD [bx], 0
je end
mov al, [bx]
int 0x10
inc bx
jmp loop
end:
pop bx
ret
我已经在 bochs 2.2.6 模拟器中运行了代码。
预期出站
你好世界再见
我得到的输出
你好世界再见再见
为什么good bye
打印两次? 另请注意,hello, world
之后还有一个额外的空格。它来自哪里? 注意:如果我只打印一个字符串代码就可以了。
您的问题来自生产线
cmp WORD [bx], 0
这是说"将bx指向的地址处的单词与0进行比较"。 但是,您正在查看的字符串由字节而不是单词组成。 为了使此比较成功,它必须在一行(也称为单词(中找到两个都包含零的字节。
这不会在HELLO_MSG结束时发生,所以它只是继续打印字符,直接穿过下面的字符串(GOODBYE_MSG(,直到它最终在times 510-($-$$) db 0
找到一对。
这也解释了您看到的额外空间,因为您实际上是在HELLO_MSG末尾打印 0。