2019-2020-1 20199314 第二周作业

时间:2023-12-15 08:39:02

1.基础学习内容

1.1 冯诺依曼体系结构

计算机由控制器、运算器、存储器、输入设备、输出设备五部分组成。
2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.1.1 冯诺依曼计算机特点
(1)采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中。
(2)存储器是按地址访问的线性编址的一维结构,每个单元的位数是固定的。
(3)指令由操作码和地址组成。操作码指明本指令的操作类型,地址码指明操作数和地址。操作数本身无数据类型的标志,它的数据类型由操作码确定。
(4)通过执行指令直接发出控制信号控制计算机的操作。指令在存储器中按其执行顺序存放,由指令计数器指明要执行的指令所在的单元地址。
(5)以运算器为中心,I/O设备与存储器间的数据传送都要经过运算器。
(6)数据以二进制表示。

1.2 汇编中的寄存器-以32bit系统为例

1.2.1 寄存器分类

4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI)
2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP)
1个标志寄存器(EFlags)

1.2.2 通用及指令指针寄存器的详细介绍
2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。如下图。
2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

1.3 计算机执行指令过程

根据PC(程序计数器,32位系统中为eip)取指令-->指令译码-->取操作数-->指令执行-->回写结果-->修改PC的值-->继续执行下一条指令。如图。
2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

1.4 寻址方式

  • 立即寻址方式(immediate addressing)
    操作数直接包含在指令中,紧跟在操作码之后的寻址方式称为立即寻址方式,把该操作数称为立即数。
  • 寄存器寻址
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 立即数寻址
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 直接寻址
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 间接寻址
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 变址寻址
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    2.汇编语言学习

    2.1汇编语言基本概念

  • 汇编指令:机器码的助记符,有对应的机器码
  • 伪指令: 没有对应的机器码,由编译器执行,计算机并不执行
  • 其他符号: 如: +、-、*、/ 等,由编译器识别,没有对应的机器码
  • 汇编语言的特点:
    ① 所占空间、执行速度与机器语言相仿
    ② 直接、简捷,能充分控制计算机的硬件功能

    2.2堆栈

    2.2.1堆栈的基本概念
    堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。如图。
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

2.2.2堆栈向上增长和向下增长
假设堆栈大小为256,一般而言32位系统中堆栈方向是向下增长的。

  • 向下增长,就是从高地址向低地址增长。栈顶即为&Taskstk[255]。
  • 向上增长,就是从低地址向高地址增长。栈顶即为&Taskstk[0]。
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

2.2.3堆栈中的基本操作及其对应的汇编语言

  • 进栈指令 PUSH
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 出栈指令 POP
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 调用进程 CALL
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 返回进程 RET
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 清除进程 LEAVE
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    2.3挑战问题

    在实验楼环境下采用vim编辑器,编写一段简单c程序,并探究c语言在汇编语言下的转换格式和内容。 将c语言文件转化为32的汇编语言,代码中函数调用内核的情况,堆栈中的变化。

2.3.1 步骤
编写的C语言程序
2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

  • gcc编译代码
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 转换为汇编语言
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 去掉辅助信息
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2.3.2 代码分析
    调用流程 main函数
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    汇编语言调用堆栈变化过程

  • 初始阶段,esp、ebp指针都是指向1000这个位置(假设堆栈大小为1000)
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

  • 执行main函数2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

  • 执行2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

  • 执行跳转到f函数执行2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

  • 执行2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    -执行跳转到g函数2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

  • 执行2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

  • 执行2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 执行2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 执行2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 执行2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 执行2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
  • 执行2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
    以上展示了一段简单代码调用函数的过程.
    展示了整个堆栈从占用->释放的过程.

总结

本周的的学习相对于上周的Linux基础是一个进阶,开始了解Linux的内核,学习了32位和16位,64位系统的区别,了解到寄存器的分类,以及寄存器的用处.学习了一些底层的调用,任何c语言在底层中都会转化为汇编语言,之前学习的简单加法程序就是由高级语言编写,并解释成汇编语言再对底层进行调用,由此可以发现高级语言虽然语法简单\可视性强,但是硬件无法直接识别,故其运行速度\可靠性并不如汇编语言.但是未来的趋势就是越来越封装的语言,未来知识越来越多\学习的时间越来越少\利用前人造好的零件去组装汽车这一行为越来越被人接受,火爆的python语言不就是符合未来的趋势吗?