软件平台:code::block+Mingw
C源码
main.c
int add(int a,int b);
void print();
int main()
{
int a=0;
a=add(1,2)
print();
return 0;
}
int add(int a,int b){
return a+b;
}
void print()
{
int a=0;
}
汇编代码
main() 主要汇编代码
0x0040131A movl $0x0,-0x4(%ebp)
0x00401321 movl $0x2,0x4(%esp)
0x00401329 movl $0x1,(%esp)
0x00401330 call 0x401344 <add>
0x00401335 mov %eax,-0x4(%ebp)
0x00401338 call 0x40134f <print>
0x0040133D mov $0x0,%eax
0x00401342 leave
0x00401343 ret
int add(int a,int b):汇编代码
0x00401344 push %ebp
0x00401345 mov %esp,%ebp
0x00401347 mov 0xc(%ebp),%eax
0x0040134A add 0x8(%ebp),%eax
0x0040134D pop %ebp
0x0040134E ret
void print():汇编代码
0x0040134F push %ebp
0x00401350 mov %esp,%ebp
0x00401352 sub $0x4,%esp
0x00401355 movl $0x0,-0x4(%ebp)
0x0040135C leave
0x0040135D ret
关键汇编代码
(1)call addr ;命令相当于 push eip ;jmp addr;
将当前eip保存到栈中,跳转到目的地址
(2)push %ebp;mov %esp,%ebp;
函数开头固定格式,将栈底指针保存到栈中,再把栈底指针设置为当前栈顶指针
(3)leave ;相当于pop %ebp;
函数结束后,还原栈顶指针,void返回值类型函数 用leave;
int返回值类型函数 用pop %ebp;
(4)ret;相当于 pop %eip;
函数返回到原函数继续执行