Мне просто интересно узнать следующий пример
#include<stdio.h>
int test();
int test(){
// int a = 5;
// int b = a+1;
return ;
}
int main(){
printf("%u\n",test());
return 0;
}
Я скомпилировал его с помощью 'gcc -Wall -o точка с запятой точка с запятой.c', чтобы создать исполняемый файл и 'gcc -Wall -S semicolon.c' дляполучить код ассемблера:
.file "semicolon.c"
.text
.globl test
.type test, @function
test:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
leave
ret
.size test, .-test
.section .rodata
.LC0:
.string "%u\n"
.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 $20, %esp
call test
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
movl $0, %eax
addl $20, %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
, так как я не такой профессионал по ассемблеру, я знаю только, что printf печатает то, что находится в eax, но я не до конца понимаю, что 'movl% eax, 4 (% esp)'означает, что я предполагаю, что заполняет eax перед вызовом test, но какое тогда значение?что означает 4 (% esp) и что означает значение esp?
, если я раскомментирую строки в test () printf print 6 - который написан на eax ^^