声明标签影响输出

时间:2017-06-21 14:24:24

标签: assembly x86 nasm

我编写了一个汇编程序来打印字符串:

[org 0x7c00]

mov bx, HELLO_MSG

HELLO_MSG:
db "Hello World!", 0

mov ah, 0x0e

PRINT:
mov al, [bx]
cmp al, 0
je END
int 0x10
add bx, 0x1
jmp PRINT

END:

jmp $
times 510-($-$$) db 0
dw 0xaa55

使用nasm编译时,它生成了以下二进制文件

BB 12 7C B4 0E 8A 07 3C 00 74 07 CD 10 83 C3 01 EB F3 48 65 6C 6C 6C 6F 20 57 6F 72 6C 64 21 00 EB FE 00 00 .... 00 00 55 AA

使用qemu仿真器的输出是

as it is clear the "ll" are replaced by other symbols

很明显,“ll”被其他符号取代。

但是,如果我将HELLO_MSG标签移到jmp $上方代码的底部,则输出正确无误。我无法理解这背后的原因。

编辑:我在原始代码中尝试使用不同的字符串代替“Hello World”时观察到以下输出

案例:“Hellllo World”(通知额外'l')

the garbage letters appears on those two bytes only

垃圾信件只出现在这两个字节上

案例:“我们是众神”

strangely the error disappeared!

奇怪的是错误消失了!

案例:“我们是众神!” (注意'!')

nothing printed, adding '!' did something terrible?

没有打印,添加'!'做了什么可怕的事情?

案例:“Hello World”(通知!'!')

removing '!' again did something terrible?

删除'!'再次做了一件可怕的事情?

1 个答案:

答案 0 :(得分:5)

您将字符串放在可执行代码的中间。所以ASCII值被视为指令操作码并执行一些操作,这可能会覆盖一些字节。

您应该在jmp指令之后将字符串放在末尾,以便不执行该字符串。或者,您可以在字符串之前添加jmp指令以跳过它。