我有一个64位寄存器,它保存一个存储器地址。如果我对寄存器的下半部分执行算术运算然后尝试取消引用它,我会得到一个分段错误。这是一个例子:
movsx rax, BYTE PTR [rdi] # ok
add edi, 1 # the address is correct but....
movsx rax, BYTE PTR [rdi] # segmentation fault here
如果我在第2行将edi更改为rdi它可以工作,所以我只是想知道为什么在这种情况下我不能使用rdi的下半部分。如果有人有任何关于正确使用寄存器下部的信息的链接/参考,我也将不胜感激。
非常感谢你的帮助。
答案 0 :(得分:5)
当您对edi
或任何其他32位下半部分寄存器执行操作时,它会自动将整个寄存器的上半部分归零。
因此rdi
之后add edi, 1
的高32位将为零。
答案 1 :(得分:4)
来自"AMD64 Architecture Programmer’s Manual Volume 1: Application Programming"
3.1.2 64位模式寄存器:
通常,字节和字操作数存储在GPR的低8位或16位中,而不修改它们 高56或48位。但是,双字操作数通常存储在低32位中 GPR 和零扩展到64位。