кто-то может объяснить, у меня есть программа на C, я могу преобразовать его в блок? если да, как?
Если вы используете gcc, вы можете сделать gcc -O2 -S -c foo.c
согласно этой странице, чтобы получить выходную сборку в удобочитаемой форме.
Большинство компиляторов имеют возможность генерировать списки сборок вместе с двоичными файлами.
В Visual Studio вы можете найти его в разделе «Генерация кода» в свойствах файла.
С gcc вы можете использовать переключатель -S (заглавная S)
Наконец, если у вас есть двоичный файл, вы можете использовать objdump -S (заглавная S).
Это то, что делает ваш компилятор.
Компилятор компилирует вашу программу 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
В gcc вы можете использовать параметр -S
:
gcc -O2 -S myfile.c
Здесь также можно использовать большинство других параметров (например, -O2
), чтобы определить, какой тип ассемблерного кода.
Обратите внимание, однако, что это просто демонстрация промежуточного шага, который компилятор все равно проходит (не создание исходного файла сборки, а машинный код, который он представляет). Конечный результат после прохождения этого кода через ассемблер ничем не будет отличаться от простой компиляции непосредственно в машинный код.
У вашего компилятора должна быть возможность сделать это. Например, для 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
Поскольку вы упомянули Dev-C++, стоит отметить, что флаг -S
работает и там. При использовании Windows, Dev-C++ все равно назовет выходной файл .exe, но результат не будет исполняемым файлом, поэтому просто измените расширение на .txt или любое другое, чтобы его можно было прочитать в выбранном вами редакторе. Добавьте опции/флаги в меню Project>Project Options>Parameters>Compiler или Tools>Compiler Options.