от C до сборки - PullRequest
       34

от C до сборки

9 голосов
/ 22 мая 2010

Может кто-нибудь объяснить, у меня есть программа на C, могу ли я преобразовать ее в сборку?если да, то как?

Ответы [ 6 ]

22 голосов
/ 22 мая 2010

Если вы используете gcc, вы можете сделать gcc -O2 -S -c foo.c в соответствии с этой страницей, чтобы получить выходную сборку в удобочитаемой форме.

5 голосов
/ 22 мая 2010

С gcc вы можете использовать опцию -S:

gcc -O2 -S myfile.c

Здесь также можно использовать большинство других опций (например, -O2), чтобы определить, какой тип кода сборки создается.

Обратите внимание, однако, что это просто разоблачение промежуточного шага, который в любом случае проходит компилятор (не генерация исходного файла сборки, то есть, а машинный код, который он представляет). Конечный результат после передачи этого кода через ассемблер никак не отличается от простой компиляции непосредственно в машинный код.

3 голосов
/ 22 мая 2010

Ваш компилятор должен иметь возможность сделать это. Например, для gcc вы можете использовать опцию -S. Краткий пример:

// test.c

#include <stdio.h>

int
main ()
{
  printf ("hello, world\n");
  return 0;
}

Скомпилируйте его с опцией -S. Это создаст файл test.s, который будет содержать сборку:

.file   "test.c"
    .section    .rodata
.LC0:
    .string "hello, world"
    .text
.globl main
    .type   main, @function
main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    subl    $4, %esp
    movl    $.LC0, (%esp)
    call    puts
    movl    $0, %eax
    addl    $4, %esp
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
    .section    .note.GNU-stack,"",@progbits
3 голосов
/ 22 мая 2010

Вот что делает ваш компилятор.

Компилятор компилирует вашу C-программу на машинный язык, который является двоичным представлением машинной программы. Когда человек хочет написать машинный язык, он записывает его на ассемблере, который переводится на двоичный машинный язык.

Код ассемблера - это просто читаемая человеком форма двоичного машинного языка.

Программа на C:

$ cat test.c 
#include <stdio.h>

int main(int argc, char **argv) {
    int a = 11+12;
    printf("a = %d\n", a);
    return 0;
}

скомпилируйте

$ gcc -c test.c

разберите его:

$ objdump -d test.o

test.o:     file format elf32-i386


Disassembly of section .text:

00000000 <main>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 e4 f0                and    $0xfffffff0,%esp
   6:   83 ec 20                sub    $0x20,%esp
   9:   c7 44 24 1c 17 00 00    movl   $0x17,0x1c(%esp)
  10:   00 
  11:   b8 00 00 00 00          mov    $0x0,%eax
  16:   8b 54 24 1c             mov    0x1c(%esp),%edx
  1a:   89 54 24 04             mov    %edx,0x4(%esp)
  1e:   89 04 24                mov    %eax,(%esp)
  21:   e8 fc ff ff ff          call   22 <main+0x22>
  26:   b8 00 00 00 00          mov    $0x0,%eax
  2b:   c9                      leave  
  2c:   c3                      ret    
1 голос
/ 22 мая 2010

Поскольку вы упомянули Dev-C ++, стоит упомянуть, что там также работает флаг -S. Предполагая, что Windows, Dev-C ++ по-прежнему будет называть выходной файл .exe, но результатом будет не исполняемый файл, поэтому просто измените расширение на .txt или другое, чтобы его можно было прочитать в редакторе по вашему выбору. Добавьте параметры / флаги в раздел «Проект»> «Параметры проекта»> «Параметры»> «Компилятор» или «Инструменты»> «Параметры компилятора».

1 голос
/ 22 мая 2010

Большинство компиляторов имеют возможность генерировать списки сборок вместе с двоичными файлами. В Visual Studio вы можете найти его в разделе «Генерация кода» в свойствах файла.
С gcc вы можете использовать ключ -S (заглавная S)
Наконец, если у вас есть двоичный файл, вы можете использовать objdump -S (заглавная S).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...