实验过程
创建一个main.c文件,并用vim编辑写入内容
用vim写入的内容是
并用gcc –S –o main.s main.c -m32命令编译成汇编代码结果如下:
代码中堆栈的变化:
- 一开始ebp和esp都指向标号为0的栈底,先看main函数"push1 %ebp",这是把ebp存储器的值压栈,将ebp寄存器的值标号0放到标号为1或者地址减4的地方.
- eip寄存器自动加1,执行move1 %esp,%ebp,将ebp寄存器也指向标号1的位置。
- eip寄存器自动加1, 然后subl $4,%esp,esp寄存器标号加1,地址减4,栈空间没有变化。
- eip寄存器自动加1,执行“movl $3,(%esp)”,将立即数3放入esp寄存器指向标号为2的位置,寄存器没变化,堆栈内容发生了变化。
- eip寄存器自动加1,执行call f,call指令相当于执行push1 %eip() movl f %eip().执行call时,eip寄存器自动加1,加1后的寄存器的村压入了标号为3的的位置然后将f函数的第一条命令的行号放入eip寄存器中。
然后另外2个函数依此类似,就不一一介绍了,另外,有几个特殊的指令等价于普通的指令。
- call: pushl %eip
movl $0×12345,%eip
- enter: pushl %ebp
movl %esp,%ebp
- leave: movl %ebp,%esp
popl %ebp
- ret: popl %eip(*)
---恢复内容结束---