【问题标题】:Inline assembly code won't compile for nothing ... is this a compiler issue?内联汇编代码不会编译...这是编译器问题吗?
【发布时间】:2013-11-28 03:48:16
【问题描述】:

我用 GCC 试过这个:

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

这就是输出:

退出:退出失败 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:这是一个错误日志;我的程序没有编译成功。

【问题讨论】:

  • 当它说退出时,表示程序已编译并执行。
  • ExitFailure 听起来有问题。
  • 它说退出失败,因为它返回了一些东西!=0
  • 但是链接器并没有释放二进制文件,所以编译确实存在问题。
  • 您的第一个 sn-p 在设置 main() 函数返回值时意外有效。由您用于运行程序的任何工具适当报告。设置 main() 返回值的更好方法是使用 return 语句。在任何关于 C 语言的介绍性书籍中都有很好的介绍。

标签: c++ assembly inline-assembly


【解决方案1】:

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

【讨论】:

  • 我不相信“ExitFailure”意味着“很好”。我也没有指定任何输出到控制台等,所以我所说的结果是一个错误,而不是控制台程序上的输出。
  • 为什么不呢?这只是程序的退出状态,由您的代码明确指定。
  • @LastLifeHump;澄清asm("movl $0, %eax"); 的实验并与return 10;return 0; 进行比较
  • @LastLifeHump 没有问题。正如卡尔所解释的,您正在返回非零退出状态。与return 10 完全相同。与 asm 无关。
  • 我想你还是误会了。您的程序已成功编译和执行。您的平台将以某种平台相关的方式解释返回值。在这种情况下,您使用的任何工具似乎都将非零退出状态解释为失败。
【解决方案2】:

您的 main 函数缺少返回值,请添加 return 0; 或您希望返回的任何内容。

【讨论】:

  • C++ 规则规定,从main() 的末尾(并且只有main)与执行return 0; 相同。
  • 我做到了,无论有没有它都没有区别。
【解决方案3】:

您的代码在 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 将根据您的代码返回 107')'。这就是为什么他们建议您尝试将 0 移动到 eax 寄存器中。

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

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

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

【讨论】:

  • 好吧,在我的编译器(没有IDE)上仍然存在ExitFailure,并且链接器没有将二进制文件放在指定的目录中。
  • i.imgur.com/ZRBTxKo.png 也许检查你的命令?你在什么操作系统上运行?什么版本的gcc?你输入了什么命令?
  • Windows 7,最新的 GCC,其他一切都最佳。没有输入命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2023-03-08
  • 2015-05-12
  • 2015-04-22
  • 2019-08-24
  • 2019-05-11
相关资源
最近更新 更多