nasm组装:字符串打印两次

时间:2019-10-11 02:22:15

标签: assembly nasm

我已经为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后还有多余的空格。它来自哪里? 注意:如果我只打印一个字符串代码就可以了。

1 个答案:

答案 0 :(得分:3)

您的问题出在线路上

cmp WORD [bx], 0

这是在说“将bx指向的地址上的单词与0进行比较”。但是,您要查看的字符串是由字节而不是字组成的。为了使此比较成功,必须在连续两个字节(又称为单词)中找到两个都包含零的字节。

在HELLO_MSG的末尾不会发生这种情况,因此它只是继续打印字符,一直沿以下字符串(GOODBYE_MSG)前进,直到最终在times 510-($-$$) db 0处找到一个对。

这也解释了您看到的额外空间,因为实际上是在HELLO_MSG的末尾打印0。