我已经为NASM汇编器编写了以下x86汇编代码。
hello.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
后还有多余的空格。它来自哪里?
注意:如果我只打印一个字符串代码就可以了。
答案 0 :(得分:3)
您的问题出在线路上
cmp WORD [bx], 0
这是在说“将bx指向的地址上的单词与0进行比较”。但是,您要查看的字符串是由字节而不是字组成的。为了使此比较成功,必须在连续两个字节(又称为单词)中找到两个都包含零的字节。
在HELLO_MSG的末尾不会发生这种情况,因此它只是继续打印字符,一直沿以下字符串(GOODBYE_MSG)前进,直到最终在times 510-($-$$) db 0
处找到一个对。
这也解释了您看到的额外空间,因为实际上是在HELLO_MSG的末尾打印0。