от C до блока

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

9
задан lego69 22 May 2010 в 11:02
поделиться

6 ответов

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

23
ответ дан 4 December 2019 в 06:35
поделиться

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

1
ответ дан 4 December 2019 в 06:35
поделиться

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

Компилятор компилирует вашу программу 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    
3
ответ дан 4 December 2019 в 06:35
поделиться

В gcc вы можете использовать параметр -S :

gcc -O2 -S myfile.c

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

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

5
ответ дан 4 December 2019 в 06:35
поделиться

У вашего компилятора должна быть возможность сделать это. Например, для 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
ответ дан 4 December 2019 в 06:35
поделиться

Поскольку вы упомянули Dev-C++, стоит отметить, что флаг -S работает и там. При использовании Windows, Dev-C++ все равно назовет выходной файл .exe, но результат не будет исполняемым файлом, поэтому просто измените расширение на .txt или любое другое, чтобы его можно было прочитать в выбранном вами редакторе. Добавьте опции/флаги в меню Project>Project Options>Parameters>Compiler или Tools>Compiler Options.

1
ответ дан 4 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: