我编写了一个汇编程序来打印字符串:
[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模拟器的输出是
很明显,“ll”被其他符号替换。
但是如果我移动HELLO_MSG
标签位于上面代码的底部 jmp $
输出是正确的。我无法理解这背后的原因。
编辑:我在尝试用不同的字符串代替原始代码中的“Hello World”时观察到以下输出
案例:“Hello World”(注意额外的“l”)
垃圾字母仅出现在这两个字节上
案例:“我们是神”
奇怪的是,错误消失了!
案例:“我们是神!” (注意“!”)
没有打印任何内容,添加“!”做了什么可怕的事吗?
案例:“Hello World”(注意!'!')
删除“!”又做了什么可怕的事?
最佳答案
您将字符串放在可执行代码的中间。因此 ASCII 值被视为指令操作码并执行某些操作,这可能会覆盖某些字节。
您应该将该字符串放在jmp
指令之后的末尾,这样它就不会被执行。或者,您可以在字符串之前添加 jmp
指令以跳过它。
关于assembly - 影响输出的声明标签的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44678858/