使用下半部分后取消引用64位寄存器

时间:2012-04-21 05:34:43

标签: assembly x86-64

我有一个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的下半部分。如果有人有任何关于正确使用寄存器下部的信息的链接/参考,我也将不胜感激。

非常感谢你的帮助。

2 个答案:

答案 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位