2

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

非常感谢你的帮助。

4

2 回答 2

5

当您对一个edi或任何其他 32 位下半部寄存器进行操作时,它会自动将整个寄存器的上半部归零。

因此, 的高 32 位rdi将在add edi, 1.

于 2012-04-21T05:44:20.687 回答
4

摘自《AMD64架构程序员手册第一卷:应用程序编程》

3.1.2 64 位模式寄存器:

通常,字节和字操作数存储在 GPR 的低 8 位或 16 位中,而不会分别修改它们的高 56 位或 48 位。然而,双字操作数通常存储在 GPR 的低 32 位中,并零扩展至 64 位

于 2012-04-21T05:48:40.767 回答