zoukankan      html  css  js  c++  java
  • 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中的编译命令将其编译为汇编指令:


    • 最后整理之后的代码如下:
    • 下面开始分析程序执行过程:
      代码在执行过程中堆栈空间和相应的EBP/ESP寄存器会不断变化。首先假定堆栈为空栈的情况下EBP和ESP寄存器都指向栈底。具体执行过程如下:



      补充:图5和图17 esp的位置在3号。
    • 遇到的困难:之前没有接触过汇编语言,在学习和理解的过程中遇到了很多困难,在通过对实验程序的分析,加深了对栈的理解,也基本理解了一些简单汇编语言的用法。后续还需要反复练习和重温。
  • 相关阅读:
    Netty入门
    hashCode方法里为什么选择数字31作为生成hashCode值的乘数
    【转】String hashCode 方法为什么选择数字31作为乘子
    NppFTP小插件的使用
    事务的基础入门
    Code Review 程序员的寄望与哀伤【转载】
    谈谈敏捷开发【转载】
    如何写代码 — 编程内功心法【转载】
    面经【转载】
    Swagger的简单入门【转载】
  • 原文地址:https://www.cnblogs.com/23du/p/9814377.html
Copyright © 2011-2022 走看看