Как мне скомпилировать asm, сгенерированный GCC? - PullRequest
63 голосов
/ 25 августа 2011

Я играю с каким-то ассемблерным кодом, и что-то беспокоит меня.

Я скомпилирую это:

#include <stdio.h>

int main(int argc, char** argv){
  printf("Hello World\n");
  return 0;
}

с gcc file.c -S -o file.S, это генерирует симпатичный маленький кусочек асмаcode:

    .cstring
LC0:
    .ascii "Hello World\0"
    .text
.globl _main
_main:
LFB3:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    subq    $16, %rsp
LCFI2:
    movl    %edi, -4(%rbp)
    movq    %rsi, -16(%rbp)
    leaq    LC0(%rip), %rdi
    call    _puts
    movl    $0, %eax
    leave
    ret
LFE3:
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
    .set L$set$0,LECIE1-LSCIE1
    .long L$set$0
LSCIE1:
    .long   0x0
    .byte   0x1
    .ascii "zR\0"
    .byte   0x1
    .byte   0x78
    .byte   0x10
    .byte   0x1
    .byte   0x10
    .byte   0xc
    .byte   0x7
    .byte   0x8
    .byte   0x90
    .byte   0x1
    .align 3
LECIE1:
.globl _main.eh
_main.eh:
LSFDE1:
    .set L$set$1,LEFDE1-LASFDE1
    .long L$set$1
LASFDE1:
    .long   LASFDE1-EH_frame1
    .quad   LFB3-.
    .set L$set$2,LFE3-LFB3
    .quad L$set$2
    .byte   0x0
    .byte   0x4
    .set L$set$3,LCFI0-LFB3
    .long L$set$3
    .byte   0xe
    .byte   0x10
    .byte   0x86
    .byte   0x2
    .byte   0x4
    .set L$set$4,LCFI1-LCFI0
    .long L$set$4
    .byte   0xd
    .byte   0x6
    .align 3
LEFDE1:
    .subsections_via_symbols

Моя следующая проблема на самом деле, как мне скомпилировать этот вывод, и могу ли я заставить GCC сделать это для меня?

Ответы [ 7 ]

77 голосов
/ 25 августа 2011

Да, вы можете использовать gcc для компиляции вашего кода asm.Используйте -c для компиляции следующим образом:

gcc -c file.S -o file.o

Это даст файл объектного кода с именем file.o.Чтобы вызвать компоновщик, выполните следующую команду:

gcc file.o -o file
45 голосов
/ 25 августа 2011

gcc может использовать файл сборки в качестве входных данных и при необходимости вызывать ассемблер. Хотя есть тонкость:

  • Если имя файла оканчивается на «.s» (строчные буквы s), то gcc вызывает ассемблер.
  • Если имя файла оканчивается на ".S" (верхний регистр 'S'), тогда gcc применяет препроцессор C к исходному файлу (то есть распознает такие директивы, как #if и заменяет макросы), и затем вызывает ассемблер для результата.

Итак, в общем, вы хотите сделать что-то вроде этого:

gcc -S file.c -o file.s
gcc -c file.s
10 голосов
/ 25 августа 2011

Вы можете встроить ассемблерный код в обычную C-программу. Вот хорошее введение . Используя соответствующий синтаксис, вы также можете указать GCC, что вы хотите взаимодействовать с переменными, объявленными в C. Программа ниже указывает gcc, что:

  • eax должен быть foo
  • ebx должно быть баром
  • значение в eax должно храниться в foo после выполнения кода сборки

\ п

int main(void)
{
        int foo = 10, bar = 15;
        __asm__ __volatile__("addl  %%ebx,%%eax"
                             :"=a"(foo)
                             :"a"(foo), "b"(bar)
                             );
        printf("foo+bar=%d\n", foo);
        return 0;
}
4 голосов
/ 25 августа 2011

Да, gcc также может компилировать исходный код сборки. Кроме того, вы можете вызвать as, который является ассемблером. (gcc - это просто программа-драйвер, которая использует эвристику для вызова компилятора C, компилятора C ++, ассемблера, компоновщика и т. д.)

3 голосов
/ 25 августа 2011

Вы можете использовать GAS, который является внутренним ассемблером gcc:

http://linux.die.net/man/1/as

2 голосов
/ 13 апреля 2017

Если у вас есть файл main.s. Вы можете создать объектный файл с помощью GCC, а также as

# gcc -c main.s
# as main.s -o main.o

проверьте эту ссылку, она поможет вам изучить некоторые инструменты GCC http://www.thegeekstuff.com/2017/01/gnu-binutils-commands/

0 голосов
/ 10 ноября 2014
nasm -f bin -o 2_hello 2_hello.asm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...