2018-2019-1 20189203《Linux内核原理与分析》第二周作业

一、本周学习情况

我本周结合《庖丁解牛》教材学习了蓝墨云的视频课,主要学习内容如下:

 1、学习了计算机的工作原理,深入理解了冯诺依曼体系结构。
 2、学习了X86-32 CPU的寄存器
 3、学习了寻址方式和常用汇编指令
      - 立即数即常数,如$8,表示$开头后跟一个数值;
      - 寄存器数,表示某个寄存器中保存的值,如%exa
      - movL表示32位指令
     - 通用寄存器:
     - EAX:累加器
     - EBX:基地址寄存器
     - ECX:计数寄存器
     - EDX:数据寄存器
     - ESI:源变址寄存器
     - EDI:目的变址寄存器
     - EIP:指令指针寄存器
  • 几种常用的寄存器寻址方式及代码:
    register mode(寄存器寻址):movl %eax,%edx edx=eax;把eax内容放入edx,等号相当于把eax赋值给edx。
    immediate(立即寻址):movl $0x123,%edx edx=0x123; 立即数是以$开头的数值,把16进制的数值放入edx。
    direct(直接寻址):movl 0x123,%edx edx=*(int32_t*)0x123;内存地址16进制的123内存放入edx,把0x123强制转化成32-bit的指针,表示取它的值。
    indirect(间接寻址):movl (%ebx),%edx edx=*(int32_t*)ebx;ebx这个寄存器存的值加个括号表示内存地址,所存储的数据放入edx。
    displaced(变址寻址):movl 4(%ebx),%edx edx=*(int32_t*)(ebx+4); 除了在间接寻址的基础上先给ebx地址上加个立即数ebx+4。
    相关的寻址方式在数据结构中曾经学习过。

    二、通过反汇编一个简单的C程序,分析汇编代码理解计算。

  • 首先在Linux中写一段C程序。随后通过Linux中的编译命令将其编译为汇编指令:
    2018-2019-1 20189203《Linux内核原理与分析》第二周作业_第1张图片
    2018-2019-1 20189203《Linux内核原理与分析》第二周作业_第2张图片
    2018-2019-1 20189203《Linux内核原理与分析》第二周作业_第3张图片
  • 最后整理之后的代码如下:
    2018-2019-1 20189203《Linux内核原理与分析》第二周作业_第4张图片
  • 下面开始分析程序执行过程:
    代码在执行过程中堆栈空间和相应的EBP/ESP寄存器会不断变化。首先假定堆栈为空栈的情况下EBP和ESP寄存器都指向栈底。具体执行过程如下:
    2018-2019-1 20189203《Linux内核原理与分析》第二周作业_第5张图片
    2018-2019-1 20189203《Linux内核原理与分析》第二周作业_第6张图片
    2018-2019-1 20189203《Linux内核原理与分析》第二周作业_第7张图片
    补充:图5和图17 esp的位置在3号。
  • 遇到的困难:之前没有接触过汇编语言,在学习和理解的过程中遇到了很多困难,在通过对实验程序的分析,加深了对栈的理解,也基本理解了一些简单汇编语言的用法。后续还需要反复练习和重温。

你可能感兴趣的:(2018-2019-1 20189203《Linux内核原理与分析》第二周作业)