-3

我用 GCC 试过这个:

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

这就是输出:

退出:退出失败 7

所以我尝试了这个:

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

并得到这个错误:

错误:在 ';' 之前应为 `)' 令牌。

我试过这个人的建议,但它不起作用。本教程另有说明。

我完全按照教程中的说明做了,如下所示:

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

并得到这个错误:

退出:ExitFailure 10

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

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

4

3 回答 3

4

您的程序正在编译和运行得很好-您只是碰巧将值710放入eax,这导致您的函数的返回值分别为710-该行为取决于您的ABI。

于 2013-11-14T22:10:18.127 回答
2

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

于 2013-11-14T22:10:22.873 回答
1

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

您甚至可以在这里在线试用 gcc 4.8.1:http: //ideone.com/dUcDc1

或 gcc 4.3.2

http://ideone.com/tNFWZH

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

在此处输入图像描述

现在至于您可能出现的错误。其他答案说您尝试返回 10 的原因是因为在汇编中,当您将值移动到 eax 并调用 ret 时,它会返回该值。

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

如果您使用 g++ x64 进行编译,那么您需要将其移至 rax iirc 中。虽然不确定,但我知道对于 eax,这是真的。

现在至于为什么它对我和其他人有用。它可能与平台有关,或者您的编译器可能有问题。有些平台实际上将返回代码解释为某种含义。

例如,在某些平台上返回 0 以外的任何值。操作系统可能会根据返回码的含义以某种方式查找返回码并进行清理。

于 2013-11-14T22:26:28.003 回答