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


    1.基础学习内容

    1.1 冯诺依曼体系结构

    计算机由控制器、运算器、存储器、输入设备、输出设备五部分组成。

    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 通用及指令指针寄存器的详细介绍

    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),每个寄存器都有自己的名称,可独立存取。如下图。

    1.3 计算机执行指令过程

    根据PC(程序计数器,32位系统中为eip)取指令-->指令译码-->取操作数-->指令执行-->回写结果-->修改PC的值-->继续执行下一条指令。如图。

    1.4 寻址方式

    • 立即寻址方式(immediate addressing)
      操作数直接包含在指令中,紧跟在操作码之后的寻址方式称为立即寻址方式,把该操作数称为立即数。

    • 寄存器寻址

    • 立即数寻址

    • 直接寻址

    • 间接寻址

    • 变址寻址

    2.汇编语言学习

    2.1汇编语言基本概念

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

    2.2堆栈

    2.2.1堆栈的基本概念
    堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。如图。

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

    • 向下增长,就是从高地址向低地址增长。栈顶即为&Taskstk[255]。
    • 向上增长,就是从低地址向高地址增长。栈顶即为&Taskstk[0]。

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

    • 进栈指令 PUSH

    • 出栈指令 POP

    • 调用进程 CALL

    • 返回进程 RET

    • 清除进程 LEAVE

    2.3挑战问题

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

    2.3.1 步骤
    编写的C语言程序

    • gcc编译代码

    • 转换为汇编语言

    • 去掉辅助信息

    2.3.2 代码分析
    调用流程 main函数

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

    • 初始阶段,esp、ebp指针都是指向1000这个位置(假设堆栈大小为1000)

    • 执行main函数

    • 执行

    • 执行跳转到f函数执行

    • 执行

    -执行跳转到g函数

    • 执行

    • 执行

    • 执行

    • 执行


    • 执行

    • 执行

    • 执行

    以上展示了一段简单代码调用函数的过程.
    展示了整个堆栈从占用->释放的过程.

    总结

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

  • 相关阅读:
    解决 idea 项目中Error:java: 无效的标记: XX:MaxPermSize=512M
    vant预览图片
    react路由
    computed和watch
    仓库系统面单常用的打印插件
    04.简单了解一下Redis企业级数据备份方案
    CRMEB 源码 login页 获取信息 缓存修改
    frp 搭建远程桌面
    ABP asp.net core 项目发布 IIS部署
    MYSQL 监控数据库SQL语句 查看数据库执行语句
  • 原文地址:https://www.cnblogs.com/morvalhe/p/11567506.html
Copyright © 2020-2023  润新知