assembly - 影响输出的声明标签的位置

标签 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”时观察到以下输出

案例:“Hello 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?

删除“!”又做了什么可怕的事?

最佳答案

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

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

关于assembly - 影响输出的声明标签的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44678858/

相关文章:

audio - 汇编播放音频文件 TASM 16 位

c - SIMD 内在函数 - 段错误

debugging - 您最喜欢的反调试技巧是什么?

c - 将数组从 C 传递到 nasm 时出现段错误

bash - 如何让 nasm 在 MacOS 的终端中作为命令工作?

assembly - 写入寄存器中存储的地址

assembly - EAX 寄存器的反转字节顺序

performance - x86_64 : is IMUL faster than 2x SHL + 2x ADD?

assembly - 为什么将 32 位寄存器移动到堆栈然后从堆栈移动到 xmm 寄存器?

.net - 针对同一 VS2012 项目中的 x86 和 x64 程序集;引用