от c до ассемблера с AT & T синтаксисом - PullRequest
0 голосов
/ 03 мая 2018

Я написал очень простую программу на 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

Я добавил несколько вопросов в сборочный файл. Может кто-нибудь объяснить, что именно происходит в файле сборки?

...