assembly - 为什么影响edx会影响整个rdx?

标签 assembly x86-64

我测试了下面的代码,想知道为什么当我们影响 edx 时,整个 rdx 会改变? 但为什么同样的事情不会发生在 dx vs. 上呢? 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
}

最佳答案

在amd64架构中,修改32位通用寄存器会清除相应64位寄存器的高32位。当修改 8 位或 16 位通用寄存器时,其他位将被保留。

此功能的目的是避免在执行非常常见的 32 位操作时依赖于寄存器的先前值。这对于乱序 CPU 设计非常有用。对于 8 位和 16 位操作则没有进行同样的操作,因为这些操作在历史上总是具有合并行为;更改此设置会使将代码移植到 64 位模式变得更加困难。

请参阅英特尔软件开发手册了解更多详细信息。

关于assembly - 为什么影响edx会影响整个rdx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73146649/

相关文章:

c - About Variable-Size Stack Frames,关于栈帧的对齐,来自CSAPP的一个例子

assembly - assembly 8086 中的 SAL/SAR 与 SHR/SAR

Windows 64 ABI,如果我不调用 Windows API,正确的寄存器使用?

c++ - 在 AMD64 (Ubuntu 11.10) 上将 boost 编译为 i386

assembly - 在 glibc 的 ld.so 中禁用 xsave

c - 不确定在缓冲区溢出攻击中将返回地址更改为什么

c++ - 使用汇编加速位测试操作

assembly - Linux x86 64 中 MSR_GS_BASE 的详细信息

c - 汇编testq和cmovg指令

linux - x86-64 Linux 汇编。由于 EFAULT,在 argv 上使用 write 不起作用? "Bad address"