assembly 为什么影响edx会影响整个rdx?[duplicate]

13z8s7eq  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(234)

此问题在此处已有答案

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
}
rlcwz9us

rlcwz9us1#

在amd 64架构中,修改32位通用寄存器会清除相应64位寄存器的高32位。当修改8或16位通用寄存器时,其他位会被保留。
此功能的目的是避免在执行非常常见的32位操作时依赖于寄存器的先前值。这对于无序CPU设计非常有用。对于8位和16位操作则没有这样做,因为这些操作在历史上总是具有合并行为;改变这一点会使代码移植到64位模式变得更加困难。
如需详细信息,请参阅 *Intel软件开发手册 *。

相关问题