IM只是好奇下面的例子C - 分號的返回值是什麼?
#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分號semicolon.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,但那麼值是多少?什麼意思是4(%esp),esp的意思是什麼?
如果我取消測試()行的printf打印6 - 這是寫在EAX ^^
很好的解釋。添加一些關於這個主題的更多信息,似乎eax及其在通過堆棧傳遞值時的用法與簡單數據類型(int,double,char,void *,...)類似,但是當它進入更多的結構時編譯器的內存管理髮揮作用。即時通訊還不確定在堆棧上發生什麼情況,以便理解空函數返回結構的空函數,但這是一個更復雜的問題/答案。無論如何 - thx – 2010-01-15 12:17:42
@John:幾乎同樣的事情發生在像'int'和'float'一樣的結構中。它被稱爲_stack垃圾_。無論內存中調用者爲返回值保留的是什麼,返回_returned_。 – 2010-01-15 12:52:58