【问题标题】:Why nasm says I have error in the assembly g++ created?为什么 nasm 说我在创建的程序集 g++ 中有错误?
【发布时间】:2012-03-16 22:20:08
【问题描述】:

我有这个 c++ 代码:

#include <iostream>
using namespace std;

int main () {

  char chr[] = "111111111111";
  int pop = 9999;
  cout << chr << (pop+1) << endl;

}

当我在 shell(64 位 linux)g++ -S hello.cpp 中做时,我得到了汇编代码:

当我在上面使用nasm hello.s 时,它说它包含很多错误,例如:

instruction needed
expression syntax error
symbol `popq' redefined

也许是因为它是 64 位的?如何编译我用 g++ 创建的 .s?

【问题讨论】:

    标签: c++ linux assembly nasm


    【解决方案1】:

    由 GCC 生成的汇编程序使用的是所谓的 AT&T 语法,这与 nasm 使用的 Intel 语法不同。您必须使用 GCC 汇编器 (as) 来编译 GCC 生成的汇编器文件。

    参见例如http://en.wikipedia.org/wiki/GNU_Assembler#Criticism.

    有关 GNU 汇编器语法的更多信息,请参阅http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax

    【讨论】:

      【解决方案2】:

      x86 有几种汇编语法。特别是nasmgasbinutils 内部的汇编程序)有不同的语法。

      很多时候,GCC 被配置为使用gas 语法发出汇编代码。您可以了解 GCC 的用途,例如 g++ -O -v -c yourcode.cc,并且您可以了解如何单独使用 gcc -vg++ -v 配置 GCC。

      您可以将 GCC 调用为 g++ -S -fverbose-asm yourcode.cc 以获得更具可读性的 yourcode.s

      【讨论】:

        猜你喜欢
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多