2020-2021-1 20209305 《Linux内核原理与分析》第二周作业

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中的执行过程

原文地址:https://www.cnblogs.com/baoxiyuan/p/13828858.html