所以...我編譯成彙編程序,用gcc -S -02 -m32:subl在這裏做什麼?
void h(int y){int x; x=y+1; f(y); f(2); }
,它給我下面的:
.file "sample.c"
.text
.p2align 4,,15
.globl h
.type h, @function
h:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call f
movl $2, 8(%ebp)
leave
jmp f
.size h, .-h
.ident "GCC: (GNU) 4.4.3 20100127 (Red Hat 4.4.3-4)"
.section .note.GNU-stack,"",@progbits
現在我知道什麼pushl和MOVEL :它們將當前幀指針存儲到堆棧中,然後將幀指針寄存器的值設置爲堆棧指針的值。
- 但我不知道是什麼subl $ 24,%esp是。我知道它將堆棧指針向下移動了24個字節。正確?
- 這是怎麼回事?
- 爲什麼movl 8(%ebp),%eax使用8?它是8字節嗎?這是爲了適應返回值+參數和到h?或者我完全離開這裏。所以這意味着從堆棧指針回看8個字節?
- 什麼是movl $ 2,8(%ebp)做什麼?它將Contant 2複製到幀指針之前的8個字節位置。當我們調用f時幀指針是否改變?如果是 - 那麼8(%ebp)指向f的參數位置。
- 什麼是假嗎?它如何「移除」堆棧框架?我的意思是你不能刪除一塊內存。在文檔中,它說mov(esp,ebp),pop ebp。
謝謝!
有趣的是,下面的答案被標記爲接受,儘管它實際上沒有給出問題1的解釋。[Here]( http://stackoverflow.com/questions/1061818/stack-allocation-padding-and-alignment)是另一個問題/答案,給出瞭解釋1。 – andreee 2015-12-15 20:24:00