我在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:这是一个错误日志;我的程序编译不成功。
答案 0 :(得分:4)
您的程序正在编译并正常运行 - 您恰好将值7
和10
放入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
无论哪种方式,它仍然有效..也返回0。
现在,对于你可能出现的错误..其他答案说你试图返回10的原因是因为在汇编时将值移到eax并调用ret,它会返回该值。
因此,您实际上是在告诉编译器,main将根据您的代码返回10
或7
或')'
。这就是为什么他们建议您尝试移动0进入eax寄存器。
如果您正在使用g ++ x64进行编译,那么您需要将其移动到rax iirc ..但不确定但是我确实知道eax这是真的。
现在为什么它适用于我和其他人..它可能是依赖于平台的,或者你的编译器可能是错误的...有些平台实际上将返回代码解释为某种东西。
例如,在某些平台上返回0以外的任何内容..操作系统可能会以某种方式查找返回代码和清理,具体取决于返回代码的含义。