【发布时间】:2018-06-06 06:12:24
【问题描述】:
我正在调试以下函数:
_print_func:
mov rdx, 0xFFFFFFFFFFFFFFFF
mov rax, 0x01
mov rdi, 0x01
mov rsi, str
movzx dx, byte [str_len] ; <--- Here
syscall
ret
函数是用
编译的nasm -g -f elf64 2.asm
我面临的问题是,在踏入movzx dx, byte [str_len] 行之后,rdx 内容是:
rdx 0xffffffffffff000d -65523
这是合理的。现在,将指令替换为:
_print_func:
mov rdx, 0xFFFFFFFFFFFFFFFF
mov rax, 0x01
mov rdi, 0x01
mov rsi, str
movzx edx, byte [str_len] ; dx replaced with edx
syscall
ret
现在注册内容是这样的:
rdx 0xd 13
看起来像移动到 32 位寄存器零扩展它的 64 位高部分。为什么会这样?
当movzx dx, byte [str_len] 时,为什么我们不零扩展eax?
【问题讨论】:
-
写入 32 位 GPR 会将相应 64 位 GPR 的上半部分归零
-
@harold 非常有趣。我在调试器中注意到了这一点。但那是什么原因呢?
标签: linux assembly x86-64 cpu-registers