Почему Nasm говорит, что у меня ошибка в созданной сборке g ++? - PullRequest
2 голосов
/ 27 февраля 2012

У меня есть этот код C ++:

#include <iostream>
using namespace std;

int main () {

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

}

когда я делаю в оболочке (64-разрядная версия Linux) g++ -S hello.cpp я получаю код сборки:

когда я использую его nasm hello.s, он говорит, что содержит много ошибок, таких как:

instruction needed
expression syntax error
symbol `popq' redefined

Может быть, это потому, что он 64-битный? Как я могу скомпилировать .s я создал с g ++?

Ответы [ 2 ]

5 голосов
/ 27 февраля 2012

Сгенерированный GCC ассемблер использует так называемый синтаксис AT & T, который отличается от синтаксиса Intel, используемого nasm. Вы должны использовать ассемблер GCC (as) для компиляции сгенерированных GCC файлов ассемблера.

См. Например http://en.wikipedia.org/wiki/GNU_Assembler#Criticism.

Для получения дополнительной информации о синтаксисе ассемблера GNU см. http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax.

3 голосов
/ 27 февраля 2012

Существует несколько синтаксисов ассемблера для x86.В частности, nasm и gas (ассемблер внутри binutils ) имеют разные синтаксисы.

Очень часто GCC конфигурируется для генерации кода ассемблера с использованием синтаксиса gas.Вы можете узнать, что делает GCC, например, g++ -O -v -c yourcode.cc, и вы можете узнать, как GCC был настроен только с gcc -v или g++ -v.

И вы можете вызвать GCC как g++ -S -fverbose-asm yourcode.cc, чтобы получить большечитаемый yourcode.s

...