NASM 组装:字符串打印两次



我为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。

最新更新