使用内联汇编指令编译代码是否需要任何标志?
我正在尝试使用g ++编译以下代码(从SO上的答案克隆):
#include <iostream>
using namespace std;
inline unsigned int get_cpu_feature_flags()
{
unsigned int features;
__asm
{ // <- Line 10
// Save registers
push eax
push ebx
push ecx
push edx
// Get the feature flags (eax=1) from edx
mov eax, 1
cpuid
mov features, edx
// Restore registers
pop edx
pop ecx
pop ebx
pop eax
}
return features;
}
int main() {
// Bit 26 for SSE2 support
static const bool cpu_supports_sse2 = (get_cpu_feature_flags() & 0x04000000)!=0;
cout << (cpu_supports_sse2? "Supports SSE" : "Does NOT support SSE");
}
但是我收到以下错误:
$ g++ t2.cpp
t2.cpp: In function ‘unsigned int get_cpu_feature_flags()’:
t2.cpp:10:5: error: expected ‘(’ before ‘{’ token
t2.cpp:12:9: error: ‘push’ was not declared in this scope
t2.cpp:12:17: error: expected ‘;’ before ‘eax’
$
答案 0 :(得分:5)
正如其他人暗示但未明确说明的那样,gcc(使用基于字符串的asm(“...”)语言而不是真正的内联汇编代码)和gas(使用AT&amp; T)的语法不正确语法而不是英特尔语法。)
google for“gcc inline assembly”启动了本教程,看起来不错:
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
您可以在此处找到gcc文档的相关部分:
http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Extended-Asm.html
答案 1 :(得分:1)
这是
__asm(
//...
)
不
__asm{
//...
}
另请注意,标准版本为asm
。
答案 2 :(得分:0)
对于gcc
内联汇编,语法为asm("<instructions>" : "<output constraints>" : "<input constraints>")
。注意使用括号而不是大括号,并且指令(和可选的约束子句)放在字符串文字中。
答案 3 :(得分:0)
我发现这种语法特定于ARM处理器和MS asm。参见
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/BABFDCGD.html
如果是其他处理器或编译器(如Keil),请查阅其支持页面。