内联汇编代码不会无编译......这是编译器问题吗?

时间:2013-11-14 22:07:46

标签: c++ assembly inline-assembly

我在GCC尝试了这个:

#include <iostream>
using namespace std;
int main()
{
asm("mov $0x7, %al");
}

这就是输出:

  

退出:ExitFailure 7

所以我尝试了这个:

#include <iostream>
    using namespace std;
    int main()
    {
    asm("mov $0xcf, %eax";);
    }

并收到此错误:

  

错误:预期`)'之前';'令牌。

我尝试了this guy's advice,但它不起作用。 This tutorial says otherwise.

我完全按照教程中所示完成,如下所示:

#include <iostream>
int main()
{
asm("movl $10, %eax");
}

并收到此错误:

  

已退出:ExitFailure 10

“ExitFailure”究竟是什么意思,为什么它们对应于操作数中的值?基本上,这里发生了什么?我个人或编辑是不对的?

PS:这是一个错误日志;我的程序编译不成功。

3 个答案:

答案 0 :(得分:4)

您的程序正在编译并正常运行 - 您恰好将值710放入eax,这会导致函数的返回值为{{分别为1}}或7 - 该行为取决于您的ABI。

答案 1 :(得分:2)

您的主要功能缺少返回值,添加return 0;或您希望返回的任何内容。

答案 2 :(得分:1)

你的代码编译得很好并且在gcc 4.8.1上执行得很好..它甚至说Process terminated with status 0 (0 minutes, 1 seconds)。我使用codeblocks和Mingw-builds 4.8.1编译它。

你甚至可以在这里尝试gcc 4.8.1:http://ideone.com/dUcDc1

或gcc 4.3.2

http://ideone.com/tNFWZH

无论哪种方式,它仍然有效..也返回0。

enter image description here

现在,对于你可能出现的错误..其他答案说你试图返回10的原因是因为在汇编时将值移到eax并调用ret,它会返回该值。

因此,您实际上是在告诉编译器,main将根据您的代码返回107')'。这就是为什么他们建议您尝试移动0进入eax寄存器。

如果您正在使用g ++ x64进行编译,那么您需要将其移动到rax iirc ..但不确定但是我确实知道eax这是真的。

现在为什么它适用于我和其他人..它可能是依赖于平台的,或者你的编译器可能是错误的...有些平台实际上将返回代码解释为某种东西。

例如,在某些平台上返回0以外的任何内容..操作系统可能会以某种方式查找返回代码和清理,具体取决于返回代码的含义。