Я написал очень простую программу на C, которая печатает символ на стандартный вывод
#include <stdio.h>
int c;
int main(){
while ((c = getchar ()) != EOF) {
putchar(c);
}
return 0;
}
затем я использовал gcc -S -m32 -fno-pic -fno-asynchronous-unwind-tables lauf.c
, чтобы преобразовать его в язык ассемблера и получил это
.file "lauf.c"
.comm c,4,4 // global variable c with 4 bytes ..
The second 4 means alignment
but what exactly does it mean?
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp // start of stack frame
movl %esp, %ebp // gives stackpointer the value of the
basepointer
pushl %ecx
subl $4, %esp //end of stackframe
jmp .L2
.L3:
movl c, %eax
subl $12, %esp // why does the compiler subtract 12 from esp?
pushl %eax
call putchar
addl $16, %esp // why esp +16?
.L2:
call getchar // calls getchar but where is c assigned to getchar?
movl %eax, c
movl c, %eax
cmpl $-1, %eax
jne .L3
movl $0, %eax
movl -4(%ebp), %ecx
leave
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.9.4-2ubuntu1) 4.9.4"
.section .note.GNU-stack,"",@progbits
Я добавил несколько вопросов в сборочный файл.
Может кто-нибудь объяснить, что именно происходит в файле сборки?