1.关于部分指令的理解
pushl %eax:把eax寄存器的值压到堆栈栈顶,相当于以下两步操作:
1.subl $4, %esp:把堆栈栈顶esp寄存器的值减4。
2.movl %eax, (%esp):把eax寄存器的值放到esp寄存器所指向的地方。
popl %eax:从堆栈栈顶的位置放到eax寄存器,即出栈:
1.movl (%esp),%eax:将esp寄存器中存的地址所存储的数据放到寄存器eax中。
2.addl $4,%esp:将堆栈栈顶esp寄存器的值加4.
call指令是函数调用,调用一个地址:
call 0x12345:两个动作由硬件一次性完成。
1.pushl %eip
2.movl ¥0x12345
把当前的eip寄存器的值压栈就是把下一条指令的地址保存起来,然后给eip寄存器赋予一个新值0x12345,即cpu执行的下一条指令就是从0x12345位置取得的。
ret
相当于把当前堆栈栈顶的一个存储单元放到eip寄存器里。
leave:
movl %ebp,%esp
popl %ebp
enter:
pushl %ebp
movl %esp,%ebp
ebp或ebp+栈空间的标号表示存储的事某个时刻的ebp或esp寄存器的值,eip+代码行号表示存储的事某个时刻的eip寄存器的值。
2.通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
1.创建main.c
2.执行以下语句
$ gcc –S –o main.s main.c -m32
结果如下:
3.关于对书上例子程序的理解和汇编指令执行过程
1.在main中的执行过程(标号为每一行代码所执行的顺序)
2.在f中的执行过程
3.在g中的执行过程