LINUX.ORG.RU

Превращение исходного кода в машинный


0

1

Решил для себя полностью разобрать, как происходит этот процесс. Но чтото на гугле ничего толково не нашел. Поэтому обращаюсь к знающим людям: накидайте плиз ссылок/примеров/объясните сами как это происходит. Те хотелось от текста элементарной программы на си перейти к асму итд. И все с пояснениями что и как и почему. Заранее спасибо.

★★

anal.c [source code] -> compiler ->anal.o [object file] -> linker [many objfiles] -> exec-binary

man {объектные файлы|линковка|компиляция|компилятор}

bk_ ★★ ()

src
preproc src
asm
bin obj
shared|static lib/executable

Jetty ★★★★★ ()

Те хотелось от текста элементарной программы на си перейти к асму итд.

dragonbook, chapter 8, 9

shty ★★★★★ ()

Compilers: Principles, Techniques, and Tools. Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman

observer ★★★ ()

Какие конпиляторы? Эту тему пару лет как минимум изучать. Чувак спрашивает - как Си перекладывается на машкоды.

Перекладывается достаточно прямо. Если взять x86 то вообще чуть ли не буквально, за счет инструкций, заделанных буквально под Си(call, ret, enter, leave etc.).

; int foo(int x, int y)
; {
;   int z = x+y;
;   printf("%d", z);
;   return z;
; }

;; адреса сишных символов разруливает линкер
extern _printf

;; секция с кодом:
section .text

_foo:
    ;; вход в функцию, создание фрейма:
    push ebp
    mov ebp, esp
    ;; выделение места под переменную на стеке
    ;;  и запихивание туда значения x
    ;;  x лежит на [EBP+8] (8 потому что еще по 4 байта занимают
    ;;  предыдущее значение EBP(см. выше) и адрес возврата,
    ;;  положенный туда в ходе CALL или еще как)
    push dword [ebp+8]
    ;;  y лежит на [ebp+12]
    mov eax, dword [ebp+12]
    ;; в eax предварительно складывается все потому что
    ;; в инструкциях x86 может кодироваться только одна адресация
    add dword [ebp-4], eax
    ;; складывание на стек параметра z под вызов функции:
    mov eax, dword [ebp-4]
    push eax
    ;; строка форматирования. Идет вторым потому что на стек все попадает
    ;;  справа налево
    push _formatStr
    ;; вызов printf
    call _printf
    ;; согласно _cdecl, место на стеке под переменные
    ;;   после вызова подчищает вызывающий:
    add esp, 8
    ;; в EAX согласно сишным соглашениям вызова, кладется возвращаемое значение
    mov eax, dword [ebp-4] 
    ;; выход.
    ;;  1. восстановление предыдущего фрейма
    mov esp, ebp
    pop ebp
    ;;  2. снятие адреса возврата со стека и переход по нему
    ret

;; секция r/o данных
section .rdata

_formatStr:
    db "%d", 0 ;; три байта, включая нуль

оптимизаций в примере может быть применено куча - начиная с того, что можно опустить создание фрейма функции(тут он не особо нужен), и заканчивая реюзом стека под z и вызов printf.

lovesan

anonymous ()

Ладно бы создавать лоргугл-треды, когда есть затруднения с формулированием поискового запроса. Но это...

geekless ★★ ()
Ответ на: комментарий от geekless

Это тренд.
Люди замыкаются в мальньких уютненьких мирках (Facebook, Reddit, LOR, чаны всякие) и боятся высунуть нос наружу. Мобильные платформы с их рафинированным миром специализорованных приложений (даже windows 8 такая будет) еще больше усугбляют это положение.
Социальность, мать ее так.

anonymous ()

Обычно так:

1. Препроцессинг

2. Лексический анализ (исходный код превращается в поток токенов).

3. Синтаксический анализ (из потока токенов строится AST).

4. Выполняется проверка и оптимизация AST

5. У интерпретаторов это самое AST напрямую интерпретируется, у компиляторов процесс идет дальше:

6. Генерируется некий промежуточный код.

7. Выполняются оптимизации промежуточного кода.

8. Из промежуточного кода генерируется код на асме.

9. Код на асме компилируется в нативный код.

Просто и понятно.

PS. Когда-то в целях поиграться и лучше ознакомится с этим процессом писал компилятор очень маленького подмножества Паскаля (использовал LLVM).

Deleted ()
Ответ на: комментарий от anonymous

спасибо. может ты еще знаешь эквивалент машинного кода для этого asm кода ?

sacred ★★ ()
Ответ на: комментарий от geekless

что не так ? тебе не нравиться вопрос ? тебе не нравится то, что я еще этого не знаю ? тебе не нравиться то, что я пытаюсь чтобы кто то за меня все сделал ? если что-то не нравиться - то в теме можно не отвечать и проходить мимо. для срача тут полно других тем

sacred ★★ ()
Ответ на: комментарий от sacred

спасибо. может ты еще знаешь эквивалент машинного кода для этого asm кода ?

Тупой вопрос. И о чём ты спросил, невежда? В каком виде ожидаешь получить ответ?

//другой анонимус

anonymous ()
Ответ на: комментарий от sacred

тебе уже дали ссылку на Intel® 64 and IA-32 Architectures Software Developer’s Manual, читаешь его и ручками заменяешь каждую инструкцию на соответствующее числовое значение. По большому счету, ассемблер - это набор мнемонических обозначений для машинных команд процессора

Harald ★★★★★ ()
Ответ на: комментарий от anonymous

Социальность, мать ее так.

Субкультуры это раньше называлось. А щас их перепутали с социальностью ;) Тому що в субкультурах надо ИРЛ куда-то вписываться, тусоваться, а тут - не отрываясь от компа, ТКП и холодильнега можно чувствовать себя в стае^Wстаде.

slackwarrior ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.