【发布时间】: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