【问题标题】:Accessing the low 32-bits of r8 through r15访问 r8 到 r15 的低 32 位
【发布时间】:2018-07-29 10:03:18
【问题描述】:

如何使用 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 寄存器应该可用。

【问题讨论】:

  • 你使用的语法错误,见gcc.gnu.org/onlinedocs/gcc/…
  • 实际的语法错误是由于将两个寄存器名称放在一个字符串中,并且在输出约束中使用了, 运算符。 (, 运算符不产生左值)。修复输入/输出约束,并使用 "r8", "r15" 会编译(但不会汇编,因为您使用的是 movl(32 位操作数大小)和 64 位寄存器。)请注意,使用 gcc,填写asm 模板字符串与将结果文本组装成机器代码是分开的。

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


【解决方案1】:

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

【讨论】:

  • "请注意,当您写入 r8d 时,它会清除高 32 位。"顺便说一句,所有 64 位寄存器都是如此,而不仅仅是 r8-r15。
猜你喜欢
  • 2021-07-05
  • 2013-03-19
  • 1970-01-01
  • 2014-01-15
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
相关资源
最近更新 更多