c - 通过 r15 访问 r8 的低 32 位

标签 c gcc x86-64 inline-assembly cpu-registers

如何使用 asm() 将 32 位值写入寄存器 r8-r15 的低位双字? 以下代码无法编译:

#include <stdlib.h>
#include <stdio.h>
int main()
    {
    float f0,f1,f2=-2.4f;
    asm volatile
    (
        "movl %2, %%r8\n"
        "movl %%r8, %1\n"
        "movl %1, %%r15\n"
        "movl %%r15, %0"
        :"=r"(f0,f1)
        :"r"(f1,f2)
        :"%r8,%r15"
    );
    printf("%f\n",f0);
    system("pause");
    return 0;
    }

我得到的错误:

unknown register name '%r8,%r15' in 'asm'

请注意,这是一个 x64 程序,因此 r8-r15 寄存器应该可用。

最佳答案

使用 r8d 访问 r8 的低 32 位。请注意,当您写入 r8d(或 64 位模式下的任何 32 位寄存器)时,它会清除高 32 位。无法写入低 32 位并保留高 32 位。

关于c - 通过 r15 访问 r8 的低 32 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48861606/

相关文章:

c - ‘;’ token 之前的错误 : expected ‘,’ , ‘)’ 或 ‘&’

assembly - xmm 寄存器上的字节操作 (AMD64)

c++ - 取消信号处理程序内的线程

c++ - 如何使用 gcc 和 intel 静态库进行编译?

c++ - 对 `_imp__SetupDiGetClassDevsA@16' 的 undefined reference (即使使用 -lsetupapi)

c - 禁用 DejaGnu 选项

linux - 32 位 LINUX 2.6 可执行文件能否在 LINUX 3.2 机器上可靠运行?

windows - 为什么 Windows x64 调用约定不使用 XMM 寄存器来传递超过 4 个整数参数?

c - 选择函数时,哪一个更有效?

c++ - 没有有用且可靠的方法来检测 C/C++ 中的整数溢出?