声明标签的位置影响输出
Position of declaring label affecting output
我写了一个汇编程序来打印一个字符串:
[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"时观察到以下输出
案例: "Hellllo World"(另行通知'l')
垃圾字母只出现在这两个字节上
案例: "We are the gods"
奇怪的是错误消失了!
案例: "We are the gods!"(注意'!')
未打印任何内容,正在添加“!”做了什么可怕的事?
案例: "Hello World"(注意!'!')
删除“!”又做了什么可怕的事?
您将字符串放在可执行代码的中间。所以 ASCII 值被视为指令操作码并执行一些操作,这可能恰好覆盖了一些字节。
您应该将字符串放在 jmp
指令之后,这样它就不会被执行。或者,您可以在字符串前添加 jmp
指令以跳过它。
我写了一个汇编程序来打印一个字符串:
[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"时观察到以下输出
案例: "Hellllo World"(另行通知'l')
垃圾字母只出现在这两个字节上
案例: "We are the gods"
奇怪的是错误消失了!
案例: "We are the gods!"(注意'!')
未打印任何内容,正在添加“!”做了什么可怕的事?
案例: "Hello World"(注意!'!')
删除“!”又做了什么可怕的事?
您将字符串放在可执行代码的中间。所以 ASCII 值被视为指令操作码并执行一些操作,这可能恰好覆盖了一些字节。
您应该将字符串放在 jmp
指令之后,这样它就不会被执行。或者,您可以在字符串前添加 jmp
指令以跳过它。