Linux Course Lesson 1
gcc -S -o lesson1.s lesson1.c -m32
Lesson1.c
int g(int x)
{
return x+3;
}
int f(int x)
{
return g(x)+2;
}
int main()
{
return f(8)+1;
}
Lesson1.s
g:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl $3, %eax
popl %ebp
ret
f:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call g
addl $2, %eax
leave
ret
main:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $8, (%esp)
23 call f
24 addl $1, %eax
leave
ret
程序从main函数入口,
subl $4 %esp
movl %ebp %esp
movl %esp, %ebp
subl $4, %esp
movl $8, (%esp)
pushl %eip
movl f %eip(24)
于是,cpu执行到23行时,进入 f 函数中。至于ebp,esp寄存器则分别为堆栈基指针和堆栈顶指针。至于具体怎么操作,可以自己在纸上画一个堆栈。ret默认返回的是 eax中的内容。
ret
<==>
popl %eip
当eip下没有可执行命令的时候,ret为默认情况,ret可解读为
popl %eax (这句是个人的理解,不一定正确。如果有谁知道,麻烦跟我说一声我的想法是否是对的,& 如果有充分的理由更好~~原谅我这个伸手党)