【发布时间】:2017-01-25 12:49:10
【问题描述】:
我正在尝试编写一个“hello world”程序来测试 g++ 中的内联汇编程序。 (仍然倾向于 AT&T 语法)
代码是:
#include <stdlib.h>
#include <stdio.h>
# include <iostream>
using namespace std;
int main() {
int c,d;
__asm__ __volatile__ (
"mov %eax,1; \n\t"
"cpuid; \n\t"
"mov %edx, $d; \n\t"
"mov %ecx, $c; \n\t"
);
cout << c << " " << d << "\n";
return 0;
}
我收到以下错误:
inline1.cpp: Assembler messages:
inline1.cpp:18: Error: unsupported instruction `mov'
inline1.cpp:19: Error: unsupported instruction `mov'
你能帮我完成吗?
Tks
【问题讨论】:
-
AT&T 语法几乎所有操作数都颠倒了。不是
dst, src,而是src, dst。您的代码破坏者注册但不使用扩展的汇编器模板来告诉 GCC。您是否考虑过 CPUID 内在函数? -
如果您read more about the GAS AT&T syntax,您很快就会了解到大多数指令都有一个后缀来说明操作的大小。例如
movb移动一个字节。当然(如前所述)颠倒操作数的顺序。 -
如果你想学习汇编,我强烈建议不要使用内联汇编。 GCC 很难做到正确,并且充满了gotchyas。您总是可以编写一个单独的汇编文件并将其汇编并与您的 C 代码链接。 gcc.gnu.org/wiki/DontUseInlineAsm
-
int c,d; int a = 1; __asm__ __volatile__ ( "cpuid" : "=c"(c), "=d"(d), "+a"(a) :: "ebx" );
标签: c++ gcc assembly g++ inline-assembly