此问题在此处已有答案:
Why do x86-64 instructions on 32-bit registers zero the upper part of the full 64-bit register?(4个答案)
四个月前关门了。
我测试了下面的代码,并且想知道为什么当我们影响edx时,整个rdx会改变?但是为什么同样的事情不会发生在dx v.s. rdx上?这是一个特性吗?为什么?
#include <stdio.h>
int main(){
__asm__("mov $18446744073709551615, %rdx\n\t");
__asm__("mov $1, %dx\n\t"); // 0xffffffffffff0001
__asm__("mov $18446744073709551615, %rdx\n\t");
__asm__("mov $1, %edx\n\t"); // 0x1
__asm__("mov $18446744073709551615, %rdx\n\t");
__asm__("xor %edx, %edx\n\t"); // 0x1
__asm__("mov $18446744073709551615, %rdx\n\t");
__asm__("xor %dx, %dx\n\t"); // 0xffffffffffff0000
}
1条答案
按热度按时间rlcwz9us1#
在amd 64架构中,修改32位通用寄存器会清除相应64位寄存器的高32位。当修改8或16位通用寄存器时,其他位会被保留。
此功能的目的是避免在执行非常常见的32位操作时依赖于寄存器的先前值。这对于无序CPU设计非常有用。对于8位和16位操作则没有这样做,因为这些操作在历史上总是具有合并行为;改变这一点会使代码移植到64位模式变得更加困难。
如需详细信息,请参阅 *Intel软件开发手册 *。