【发布时间】:2018-12-07 21:14:00
【问题描述】:
我正在尝试将这段代码转换为与 g++ 使用的 AT&T 程序集一起使用:
double sqrt13(double n)
{
__asm{
fld n
fsqrt
}
}
基于此链接:https://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html: 我试过这个:
double raiz (double n)
__asm__ ( "fld n\n\t"
"fsqrt\n\t" );
但我一直收到:
/tmp/cc2AQhHj.s|662|Error: junk `n' after expression|
同样的错误信息在该文件的其他行中又出现了四次
我下载了一个名为“intel2gas”的程序,他对我说代码应该是这个:
__asm__ volatile__ (
"fld %0\n"
"fsqrt\n"
:"=m"(n)
:
:"memory", "esi", "edi", "eax", "ebx", "ecx", "edx"
);
将其放入函数中并尝试运行它,我收到:
|39|error: expected ‘(’ before ‘volatile__’|
|42|error: expected ‘)’ before ‘:’ token|
|45|error: ‘volatile__’ was not declared in this scope|
加上一个 |46|警告:函数中没有返回语句返回非 void|
那么,有什么建议吗?
【问题讨论】:
-
尝试将其更改为
volatile。根据docs,asm可以是__asm__,但我认为 volatile 应该是volatile。 -
在那之后,当我认为它应该是一个输入时,你指定'n'是一个输出。而且那个破坏者名单很奇怪。
-
GCC 的内联是一个复杂的野兽,使用 x87 浮点约束更加困难。您必须阅读内联汇编使用手册。这可能会成功
double raiz (double n) { __asm__ ("fsqrt" : "+t"(n)); return n; } -
内联汇编是必需的吗?为什么不以真正的组装开始(并以)结束?
标签: assembly x86 g++ inline-assembly x87