我在學習如何理解彙編程序中的c函數。我編譯使用以下的C程序 「GCC code.c -m32 -o代碼-S -fno堆疊保護器」瞭解程序集中的c函數
#include <stdio.h>
void function(int a, int b, int c)
{
char buffer1[5];
char buffer2[10];
}
void main()
{
function(1, 2, 3);
}
的裝配臺輸出在以下:
.section __TEXT,__text,regular,pure_instructions
.globl _function
.align 4, 0x90
_function:
pushl %ebp
movl %esp, %ebp
subl $28, %esp
movl 16(%ebp), %eax
movl 12(%ebp), %ecx
movl 8(%ebp), %edx
movl %edx, -4(%ebp)
movl %ecx, -8(%ebp)
movl %eax, -12(%ebp)
addl $28, %esp
popl %ebp
ret
.globl _main
.align 4, 0x90
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $1, (%esp)
movl $2, 4(%esp)
movl $3, 8(%esp)
call _function
addl $24, %esp
popl %ebp
ret
.subsections_via_symbols
ESP和ebp寄存器不能相等,因爲在_main和_function中定義int a,b,c的偏移量是不同的。什麼行從ebp中減去4?
謝謝!
但是,哪行代碼分配這些字節? – user1455332 2013-03-04 20:05:30
這是'call'指令,它會自動將堆棧中的返回地址壓入堆棧,並將esp增加4.我會將其添加到答案中,以使事情清楚。 – mikyra 2013-03-04 20:07:57