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

ds1*_*848 2 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
Run Code Online (Sandbox Code Playgroud)

如果我在第2行将edi更改为rdi,那么我只是想知道为什么在这种情况下我不能使用rdi的下半部分.如果任何人有任何关于正确使用寄存器下部的信息的链接/参考,我也将不胜感激.

非常感谢你的帮助.

Mys*_*ial 5

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

因此,高位32位rdi后将为零add edi, 1.