JMU软件计组与汇编语言 期末大纲整理

本文详细介绍了冯·诺依曼体系结构,强调了数据和指令的二进制表示以及存储程序工作方式。此外,深入探讨了CPU的组成部分,如控制器、算术逻辑单元ALU、寄存器和内部总线,以及指令的执行流程。还详细阐述了指令流水线、补码加减法运算和溢出问题。最后,讲解了8086架构CPU的内部结构,包括段寄存器、寻址方式和逻辑地址的计算。
摘要由CSDN通过智能技术生成

第一章

重点0:冯·洛伊曼体系

  • 冯·洛伊曼体系的三个特点

  • 1)采用二进制代码表示数据和指令,即信息的数字化

  • 2)采用存储程序工作方式,即事先编制程序,实现存储程序,自动、连续地执行程序

  • 3)由存储器、运算器、控制器、输入设备、输出设备等5大部件组成的计算机硬件系统

重点1:一切数据和指令

一切数据和指令都是二进制数

运行时存放在内存中

  • 程序在内存中的本质是在内存中以汇编语言的形式连续存放的指令
  • 每个指令都是一个长短不一的二进制数(或者以16进制表示P183

思考题

  • 请画出以下数据和指令在内存中的存放。设代码段从内存100H开始存放,数据段从内存200H开始存放。

    ​ A DB 10H
    ​ B DW 20H
    ​ …
    ​ START: MOV AL, A (设该指令占3个内存单元)
    ​ MOV AH,0 (设该指令占4个内存单元)
    ​ ADD B,AX (设该指令占3个内存单元)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6iDiYiKG-1640928640494)(file:///C:\Users\GhostLX\AppData\Roaming\Tencent\Users\765712614\QQ\WinTemp\RichOle\B_JZ0WW%Y14$Y]1ZQCQ00DO.png)]

重点2:存储程序工作方式

  • 存储程序工作方式的意思就是程序编译后变为一连串指令组成汇编程序,程序工作时将该汇编语言程序载入内存,指令按顺序存放
  • 在执行程序时根据寄存器CS和IP的值指向程序的第一条指令地址,然后每读取一条指令,就在IP上加上该指令的长度,即指向了该程序的下一条。

思考题

  • 如何根据CS和IP寄存器的值找到指令地址?

    存储器分段与寻址P133

    8086的地址总线宽度为20位

    2 20 = 1024 K = 1 M 2^{20}=1024K=1M 220=1024K=1M

    1 M B 1MB 1MB的存储器里,每个存储单元都有唯一的 20 20 20位的地址,称为物理地址

  • 物理地址 = 段基址 × 16 + 偏移地址 物理地址=段基址\times 16 + 偏移地址 物理地址=段基址×16+偏移地址

  • C S × 16 + I P CS \times 16 + IP CS×16+IP,CS左移4位,加IP

  • 即CS储存的是物理地址(20位)的高16位,例如 X X X X 0 H XXXX0H XXXX0H,其低四位二进制数为 0 0 0,即能被16整除的主存地址才可以作为段基址

思考题

  • 修改IP地址的指令会造成什么效果,在哪些地方用到?

1、分支程序(if-else)

程序转移指令是实现分支程序(if-else)设计的必要条件

条件转移语句后跟标号,就把ip寄存器的值修改为标号所代表的内存地址,于是就跳到了标号所在的指令作为下一条执行指令

1)无条件转移指令

JMP 目标地址

2)有条件转移指令

2、子程序返回主程序

CALL 子程序时,将主程序中CALL指令的下一条指令的地址(即IP寄存器的值)存入堆栈,然后将IP寄存器的值 设置为子程序的第一条指令所在地址。

子程序执行到RET时,取出堆栈顶部的值,即之前CALL指令压进去的IP寄存器的值,也就是主程序CALL指令的下一条指令的地址

二、语言处理的两种方式

解释方式和编译方式

重点:两种方式执行源程序的方法和特点。要会简要概括。

答:

①解释方式,在解释过程中所需主存比较小,它的优点是支持人机对话方式的程序设计,可以边执行边修改,但是执行的速度慢

②编译方式,在编译过程中所需的主存比解释方式多一些,即要容纳源程序又要容纳一个比较大的编译程序,需要花费的时间多一些。但是在用户执行程序时,所需的主存空间较小执行速度也较快。

三、主存储器容量

  • 重点:字节数P20

1KB=1024B=1024个内存单元,1MB=1024KB等。

一个内存地址=一个内存单元=一个字节=8位二进制数

  • 所以长度为9到16位的二进数要两个字节,长度25到32位的二进制数要四个字节,以此类推。8位相当于2位16进制数
    • 所以一个字节最大能存放的数是FFH.(注意!数字后面加上H代表该数是16进制数)
  • 存放长度大于一个字节的数,低字节放在低地址,高字节放在高地址,先将低字节两位塞满再填充高字节。
    • 如将1FFH存放在内存地址为100H和101H的单元中,则100H放FFH,101H放01H。参考P134???
  • 一个DB变量的值是一个字节,一个DW变量的值要占用2个字节。
    • 一个寄存器容量为2个字节
      • 注意,AH,AL是AX的上半部分和下半部分,可以单独拿出来存数据,容量一个字节。BX CX DX同理
  • 这就是内存单元、内存地址以及存放数据到底是怎么回事,一学期都在懵逼的这会请彻底搞清楚,不然汇编语言没法复习。

第二章

一、原码和补码表示法

重点0:整数的表示

只要求掌握整数的表示方式,小数不作要求,浮点数表示法也不做要求。

重点1:原码的表示

P28 例2-2要看

  • 原码的表示方式,即最高位用于表示符号位(0正1负)。

    • 注意这个“最高位”的概念是和数据长度相关的
      • DB型长度8位,就是第8位作符号位
      • DW型长度16位,就是在第16位作符号位
    • 不是把数字翻成二进制数后再往前面加个0或1!
  • 思考题1:

    • 将字长8位的数字-10用原码表示
      • 10的二进制为1010,字长8位,负数符号位为1
      • 故原码为10001010,不是11010!
    • 将字长16位的数字-10用原码表示
      • 则为1000000000001010
  • 思考题2:

    • 字长8位的原码能表示的最大值和最小值是多少?

    − ( 2 n − 1 − 1 ) ∼ 2 n − 1 − 1 -(2^{n-1}-1)\sim 2^{n-1}-1 (2n11)2n11

    即-127~127

重点2:补码的表示

补码只需要这样理解:原码的最高位代表正负号,其他位代表数字,而补码的最高位为1则代表-128(8位二进制数)或-32768(16位二进制数),其他位还是代表正数,值为这两者的综合。

  • 思考题1:补码的10001111和00001111各代表什么值?

    ​ 10001111 = 10000000 + 1111 = -128 + 15 = -113
    ​ 00001111 = 00000000 + 1111 = 0 +15 = 15

  • 思考题2:字长8位的补码能表示的最大值和最小值是多少?(注意和原码的区别)

− 2 n − 1 ∼ 2 n − 1 − 1 -2^{n-1}\sim 2^{n-1}-1 2n12n11

即-128~127

  • 掌握:一个二进制数作为原码的值和作为补码的值,一个十进制数翻译成原码和补码

二、非数值信息(字符等)的表示方法:

  • 两种编码方案
    • ASCII方案
    • UNICODE方案

记住这两种方案是为了用二进制数来表示字符即可。

三、指令的二进制表示

一条指令中所包含的基本信息:主要两种,操作码地址码 P42

指令地址由程序计数器PC(具体到80X86系CPU中就是CS:IP)表示,操作数由指令中的地址码规定 P43

  • 地址码

    • 三地址指令

      • OP A1 A2 A3

        A1 OP A2 -> A3

      • 最终结果保存在A3

    • 二地址指令

      • OP A1 A2

        A1 OP A2 -> A1

      • 最终结果保存在A1(目的操作数),A2称为(源操作数)

      • Intel80x86的运算类指令,使用二地址指令格式

    • 一地址指令

      • 只有目标操作数的单操作数指令
        • OP A -> A
      • 隐含约定目的地址的双操作数指令
        • AC OP A -> AC
        • 如同80x86中的乘法、除法指令
    • 零地址指令

      不需要操作数的指令

      • 空操作指令、停机指令

      • 所需要的操作数是隐含约定的

        80x86的串操作处理指令

  • 指令地址是由程序计数器PC来决定的,而操作数地址是由指令中的地址码规定的。

程序计数器PC(具体到80X86系CPU中就是CS:IP)

四、寻址方式!P46

  • 寻址方式的本质

就是指令地址码的表示,也就是给出指令中所需要的数据的方法!

  • 指令中需要的数据主要以如下三种方法给出:

1、立即寻址

  • 直接给

    • MOV AX,1234H,其中1234H这个操作数是直接给的,这就是立即寻址

    即这是一个具体的数值

2、寄存器寻址

  • 给数据所在寄存器和目标寄存器:
    • MOV AX,BX,需要传送的值在BX中,传送目标AX
    • 都是以寄存器形式给出。这就是寄存器寻址

3、间接寻址:

  • 给数据所在的内存单元

    这种内存偏移地址直接给出的寻址,就叫直接寻址

    • 内存单元地址用**[地址]**的形式给出
    • 注意,给的都是相对于基地址的偏移地址不是真正的物理地址

    即以数据段基地址为起始地址0的偏移地址!

    • MOV AL,DS:[10] 将数据段第10个内存单元内的数据给AL

    • MOV AX,DS:[10] 将数据段第11个内存单元的数据作为高8位,第10个内存单元数据作为低8位,给AX

      想想为什么是这个操作?这个也是基本的了,想不明白看第一章和第四章的相关要点)

      答:高高低低原则,低地址放低位,高地址放高位

      基地址在DX中

  • 直接寻址的差别?

    • 直接寻址:直接给出物理地址

4、寄存器间接寻址

MOV BX,10
MOV AL,[BX] // = MOV AL,DS:[10]
MOV SI,10
MOV AX,[SI] // = MOV AX,DS:[10]

  • 这种将偏移地址放在寄存器中的方式就是寄存器间接寻址
    • 若寄存器使用了BX,也叫基址寻址
    • 若寄存器使用了SI或DI,也叫变址寻址
    • 若用了[bx+si]的形式,叫基址变址寻址

5、相对寻址

MOV BX,10
MOV AL,[BX+5] // = MOV AL,DS:[15]

这种偏移量再加上一个数值的叫做相对寻址

思考题

以下是一个数据段定义

DATA SEGMENT
A DB 5
B DW 6
C DB 7
DATA ENDS

  • 请使用间接寻址寄存器间接寻址的方法,将C的值送入寄存器AL,将B的值送入寄存器DX (相关知识:数据定义后在内存中的存放方式,先看第一章的复习要点,再看P188-190变量的定义!)

    • 间接寻址

      MOV AL DS:[3]

第三章

一、CPU的基本组成部分和作用P61-62

1、控制器

  • 产生一系列控制信号,以控制计算机中各部件完成

    • 取指令
    • 分析指令
    • 执行指令

    的操作

2、算术逻辑单元ALU

  • 实现指令所指定的各种算术逻辑运算

3、各种寄存器

  • 存放指令、指令地址、操作数及运算结果

4、CPU内部总线

  • 连接CPU内部各部件,为信息传递提供通路

二、CPU的指令分段执行过程P64-65

记住有几个步骤,每个步骤具体做了什么事情,用自己的话简要说明就可以

1、取指令

  • 根据计数器PC提供的地址从主存储器中读取当前指令
  • 送到主存数据缓冲器MDR
  • 然后再送往CPU内的指令寄存器IR中。

CU:Control Unit分析指令,给出控制信号

IR:Instruction Register 存放当前执行的指令

PC:Program Counter 存放指令地址

  • 同时改变指令计数器PC的内容,使之指向下一个条指令地址紧跟当前指令立即数地址码

    立即数,即常量,如同10H,12H

2、分析指令

  • 若采用组合逻辑控制器,则通过译码电路译出IR中指令的各字段表示什么操作,并在时序系统的配合下产生该指令对应的微操作命令序列
  • 若采用微程序控制器,则可根据指令的操作码标志位转向控制存储器取出对应的微程序,由微指令提供微操作命令序列

3、执行指令

  • 1)取操作数
    • 如果当前指令需要从主存取操作数,就安排时间再次访问存储器
  • 2)执行操作
    • 如果当前指令需要运算,则需要形成稳定运算结果的时间,为此安排专门的节拍
    • 乘除、浮点运算则需要占用更多的节拍
    • 运算结果需要送回主存单元,则应安排时间以完成对主存的写操作
  • 3)形成下一条指令地址
    • 对于顺序执行的指令,下一条指令地址在取指令、取立即数、取地址时,就已经形成在PC中;
    • 对于转移类指令,则将形成的转移地址送到PC中。以后再取下一条指令、分析、执行……
    • 如此循环直至程序执行完毕或外来干预为止

三、时序控制方式(同步时序控制)

重点一、同步控制方式的含义P65-66

  • 同步控制方式是指各项操作统一的时序信号进行控制
  • 每个微操作在规定时间内完成,到达规定时间自动执行后继的微操作。
  • 其基本特征是将操作时间分为若干个长度相同时钟周期节拍),要求在一个或几个时钟周期内完成各个微操作。

重点二、多级时序的概念和关系 P66-67

组合逻辑控制器中,一般分为三级:机器周期、节拍、时钟脉冲

指令周期:
  • 指从取指令、分析指令到执行完该指令所需的时间。
  • 不同指令指令周期长短不同。
机器周期:

eg:取指令周期、存储器读周期、存储器写周期等

不同的机器周期中完成不同的操作

不同的机器周期长短可以不同

  • 将一个指令周期划为不同的阶段,每个阶段所需时间称为机器周期
时钟周期(节拍):

不同的机器周期,或不同指令中的同一时钟周期,包含的节拍数可能不同

  • 一个机器周期的操作可以分为几步基本操作,
  • 因此将一个机器周期分为几个相等的时钟周期,每个时钟周期完成一步基本操作
时钟脉冲:

1节拍 == 1 时钟周期,节拍确定了,时钟脉冲也确定

  • 时钟脉冲信号是时序系统中的基本定时信号,一个时钟周期一个或几个时钟脉冲构成。

四、指令流水线

重点:指令流水线的阶段划分和意义P68-69

  • 指令流水线执行过程中可分为6个几乎用相同时间的阶段

  • 指令流水线在一条指令执行下一阶段时,可以执行下一条指令的这一阶段

  • 注意看图3-8,理解指令流水线是如何节省指令执行时间的。

    该指令在执行“译码指令”阶段,下一条指令就开始执行“取指令”阶段

思考题

  • 假设指令流水线所有阶段都能并行,一条指令分为6个阶段执行

  • 那么执行10条指令可以在几个时间单位内完成,相比不采用指令流水线节省了多少时间?

  • 若一条指令分为5个阶段执行呢?

答:执行10条指令,可以在(10+5=15)个时间单位内完成,不采用指令流水线需要60个时间单位,节省了45个时间单位

若分为五个阶段,则可以再(10+4=14)个时间单位内完成,不采用时间流水线需要50个单位,节省了36个时间单位

五、算数逻辑部件ALU

重点1、算数逻辑部件的作用与核心部件

  • 算术逻辑部件ALU主要完成二进制代码的定点算术运算逻辑运算

  • 算术运算的基础是操作,故ALU的核心加法器。P70

    如何构成以为二进制加法单元,即全加器

    n位全加器连通进位信号,传送逻辑,构成一个n位并行加法器

重点2、补码的加减法运算与溢出问题

  • 只要求掌握整数的补码加减法运算,注意看例3-3 P76-77。

  • 注意,补码加法运算就是直接两个二进制数的补码相加(包括最高位),最高位的进位直接舍去

    (即两个8位数相加,产生的第9位进位舍去)。

  • 补码减法运算就是转换为被减数加上减数的相反数的补码,即X-Y = X + (-Y), -Y和Y的关系是:将Y的补码按位取反,即每一位的1变0,0变1,得到的二进制数再加上1,就是-Y的补码。

  • 即 补码取反加一

  • 十进制数如何转化为二进制补码的知识如果忘了,回头看第二章复习要点。

    模2取余法,然后转换为原码

    原码再转换为补码

    1、取反加一

    2、规律法,负数最后一个’1’的右边跟原码一样,左边跟反码一样

    11110100
    00001100

补码的加减法运算

例3-3

[ X ] 补 = 00110110 , [ Y ] 补 = 11001101 [X]_补=00110110,[Y]_补=11001101 [X]=00110110,[Y]=11001101

[ − Y ] 补 = 00110010 + 1 = 00110011 [-Y]_补=00110010+1=00110011 [Y]=00110010+1=00110011

[ X ] 补 + [ Y ] 补 = [X]_补+[Y]_补= [X]+[Y]=

00 011 0110

01 100 1101

10 000 0011

异号,自然进位1没有问题

[ − Y ] 补 = 00110010 + 1 = 00110011 [-Y]_补=00110010+1=00110011 [Y]=00110010+1=00110011

[ X ] 补 + [ − Y ] 补 = [ X − Y ] 补 [X]_补+[-Y]_补=[X-Y]_补 [X]+[Y]=[XY]

0 011 0110

0 011 0011

0 110 1001

补码的溢出问题

溢出问题见例3-4 P77

  • 注意溢出最高位产生进位是两回事!
  • 最高位产生进位不一定是溢出溢出也不一定在最高位产生进位
  • 所谓溢出,指两个正数补码相加,运算结果变成负数;或两个负数补码相加(即两个符号相异的数相减),运算结果变为正数

两个符号相异的数相加不可能溢出

  • 溢出

    • 运算结果为正,且大于所能表示的最大正数,称为正溢
    • 运算结果为负,且小于所能表示的最小负数,称为负溢
  • 结合例3-4的正溢例子63+66和负溢例子-63+(-66),看看两个二进制数补码相加得出的结果,转化为十进制数是什么,和原本十进制的运算结果是否符合?

  • -31 -12

    1 110 0001

    1 111 0100

    11 101 0101(前面的进位1自然舍去

    值为-43

  • 63 66

    0 011 1111

    0 100 0010

    01 000 0001

    转换为十进制结果为-127,正确答案为129,与原本的不相符

  • -63 -66

    1 100 0001

    1 011 1110

    10 111 1111

    转换为十进制结果为127,正确为-129,与原本的不相符

  • 单符号位判断是否溢出

    溢出= A n ‾ B n ‾ S n + A n B n S n ‾ \overline{A_n}\overline{B_n}S_n+A_nB_n\overline{S_n} AnBnSn+AnBnSn

    双符号位判断是否溢出
    00表示结果为正数,无溢出

    01表示正溢出,本应该为正,但是为负了,超过最大能表示的正数,为正溢出

    10表示负溢出

    11表示运算结果为负数

六、组合逻辑控制器与微程序控制器

重点、组合逻辑控制器与微程序控制器的定义

  • 根据产生信号的方式不同,控制器分为组合逻辑控制器微程序控制器

    • 组合逻辑控制器:产生控制信号(微命令)的部件,用组合逻辑线路来实现。每个微命令需要一组逻辑门电路,根据相应逻辑条件来产生该微命令。

      微命令–>逻辑

    • 微程序控制器:的基本思想是将机器指令分解为基本的微命令序列,将微命令进行二进制编码编成微指令微指令序列构成微程序,即一条机器指令对应一段微程序

      微指令序列–>微程序

      程序一组指令组成

      指令由一个微程序实现

      微指令由一组微操作实现,微指令由一组微命令组成,微操作是接受到微命令后执行的操作

      微程序由一组微指令实现

      微操作 ∈ \in 微指令 ∈ \in 微程序

第四章

一、8086架构CPU的内部结构

P119 注意看图4-2

  • 本课程所有的和汇编语言相关的知识都基于8086架构CPU

  • 即只使用十六位寄存器

    • 通用寄存器:AX,BX,CX,DX,SP,BP,SI,DI
    • 段寄存器:CS,DS,SS,ES,IP

    这几个寄存器。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jJtGpcG0-1640928640497)(C:\Users\GhostLX\AppData\Roaming\Typora\typora-user-images\image-20211229202719553.png)]

  • 数据总线为16位,地址总线为20位

  • 8086CPU

    • 执行部件EU

      各寄存器和内部数据通路都是16位

      • 一组通用寄存器
      • 算术逻辑运算部件ALU
      • 暂存器
      • 标志寄存器
      • EU控制器

      执行部件EU的功能:

      1、从指令队列中取出指令代码,由EU控制器进行译码后产生对应控制信号各部件以后完成指令规定的操作

      2、对操作数进行算术逻辑运算,并将运算结果的特征状态存放在标志寄存器中。

      3、由于EU不直接与系统总线连接,因此当需要与主存储器I/O端口传送数据时,EUBIU发出命令,并提供给BIU16位有效地址与传送的数据

    • 总线接口部件BIU

      • 一组段寄存器
      • 指令指针
      • 六字节的指令队列
      • 20位的总线地址

      总线接口部件BIU的功能

      1、从主存取出指令送到指令队列中排队

      2、从主存或I/O端口操作数存放运算结果

      3、计算并形成访问主存的20位物理地址

二、逻辑地址、物理地址、基地址和偏移地址的关系 P121,P132-133

第一章复习要点里说明了主存单元是什么,第二章在寻址方式中已经提到过了基地址和偏移地址的概念,这里再来进一步解释

存储器分段与寻址P133

8086的地址总线宽度为20位

2 20 = 1024 K = 1 M 2^{20}=1024K=1M 220=1024K=1M

1 M B 1MB 1MB的存储器里,每个存储单元都有唯一的 20 20 20位的地址,称为物理地址

  • 逻辑地址 = 段基址 × 16 + 偏移地址 逻辑地址=段基址\times 16 + 偏移地址 逻辑地址=段基址×16+偏移地址

  • C S × 16 + I P CS \times 16 + IP CS×16+IP,CS左移4位,加IP

  • 即CS储存的是物理地址(20位)的高16位,例如 X X X X 0 H XXXX0H XXXX0H,其低四位二进制数为 0 0 0,即能被16整除的主存地址才可以作为段基址

  • 8086主存地址形成中说明了,由于8086架构CPU可以支持1M主存

  • 2 20 2^{20} 220次方个主存单元,既然每个主存单元对应一个主存地址,那么主存地址也有 2 20 2^{20} 220次方个,需要用20位二进制数来表示全部主存地址。

逻辑地址

相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干

  • 但是,问题来了,由于CPU中的所有寄存器都是16位的,怎么使用16位寄存器表示20位的主存地址呢?
  • 所以需要两个寄存器,一个寄存器表示基地址,即记录数据段(使用段地址寄存器DS)和代码段的起始地址(使用段地址寄存器CS),但不是记录原始值,需要一个处理,马上就说明。
  • 另一个寄存器表示偏移地址偏移地址即数据所在内存单元地址相对于起始地址的距离,即数据所在内存单元地址减去起始地址。逻辑地址的表示方式为:基地址:偏移地址

物理地址

加载到内存地址寄存器中的地址,内存单元的真正地址

  • 物理地址即真实的内存地址,和逻辑地址的关系是基地址左移4位,加上偏移地址。

  • 二进制数左移四位相当于乘以2^4,即乘以16(十六进制的10H),所以物理地址和逻辑地址的关系是

    • 物理地址 = 基地址*10H + 偏移地址。

    所以,段地址寄存器DS和CS中存放的基地址,是真实数据段和代码段的起始地址除以10H

  • 汇编指令中用的数据地址全部是偏移地址,计算机根据DS的值和指令中给出的偏移地址找到内存真实物理地址中的数据!而程序要执行下一条指令时,根据IP寄存器的偏移地址和CS寄存器中的基地址,找到下一条要执行的指令在内存中的位置并读入CPU

思考题

  • 已知汇编语言的数据段载入内存中,起始物理地址是2000H,代码段载入内存中的起始物理地址是3000H。

    • 请问DS和CS的值分别是多少?

      DS = 200H, CS = 300H

    • MOV AL,[10H] 是读取哪个内存单元的数据?

      200FH

    • 已知IP的值为100H,请问计算机下一条要执行的指令在内存的哪个单元?

      2100H

三、80X86 CPU的寄存器

重点一、通用寄存器

  • 通用寄存器中,AX,BX,CX,DX这四个都是十六位寄存器,容量相当于两个内存单元,可以存放一个四位的十六进制数

  • 但是重要的特点是这四个寄存器都可以分为两半

    如AX寄存器可以分为AH寄存器和AL寄存器

    这两个寄存器都是8位的,存放AX值的高8位和低8位。

    注意,对AX的修改直接改变AH和AL,修改AH和AL也会影响AX的值,其他寄存器同理。

  • 其余四个通用寄存器BP,SP,DI,SI也是16位寄存器,但是它们不能分为两半来使用!

    寄存器以X为后缀的才可以分成两半

思考题

思考题:依次执行以下命令

  • MOV AX,234H 请问此时AX=? AH=? AL=?

    AX=0234H, AH=02H, AL=34H

  • MOV AL, 78H 请问此时AX=? AH = ? AL = ?

    AX=0278H, AH=02H, AL=78H

  • MOV AH,9AH 请问此时AX=? AH=? AL= ?

    AX=9A78H, AH=9AH, AL=78H

  • MOV AX,FFH 请问此时AX=? AH=? AL=? (注意,FFH相对于AX应该是00FFH)

    AX=00FFH, AH=00H,AL=FFH

重点二、指令寄存器和标志寄存器

  • 指令寄存器即IP,存放下一条指令的偏移地址

    • 计算机每执行完一条指令就根据CS:IP定位到下一条指令

    • 所以修改IP的值可以改变指令的执行顺序

      即实现if和循环语句的功能。这是第五章的条件转移语句与循环语句的本质。

  • 标志寄存器存放每一条指令执行后结果的状态,这也就是为什么第五章讲到的条件转移语句循环语句可以根据上一条指令执行的结果来执行条件转移

重点三、段寄存器

  • 段寄存器有CS,DS,SS,ES这四个
    • 本学期仅要求理解CS和DS,即代码段寄存器和数据段寄存器
    • 前面已经说过了,这两个寄存器是用来存放代码段起始地址/10H数据段起始地址/10H的,所有汇编指令仅给出数据偏移地址,并根据DS定位数据基地址
  • ES只需要知道在串操作命令中需要用到
    • 作为操作目标内存空间起始地址/10H(如将一段内存中的数据移到另一段内存,ES存另一段内存空间起始地址/10H)。

四、主存储器读和存储数据的规则 P131

重点一、数据存储和读取的原则

第一章要点已经说到了,一个内存地址对应一个内存单元,而且一个内存单元只有8位,只能存放一个2位的十六进制数!

  • 那么比2位十六进制数长的,就需要两个以上内存单元来存。

  • 读取一个2位以上的十六进制数,也需要读取两个内存单元,那么这个存和读,就需要遵循高高低低的原则:

    • 存数据的时候,低地址存低位数字,高地址存高位数字,从低到高2位2位的存。
    • 读数据的时候,也是从低地址往高地址读,低地址读出来的值作为低位高地址读出来的值作为高位
  • 注意:存数据和读数据,到底存几个内存单元,读几个内存单元

  • 由指令中另外一个寄存器或者变量的类型决定

    • 8位寄存器或DB变量就只读/写一个内存单元
    • 16位寄存器或DW变量读/写两个单元。

思考题

偏移地址10H11H12H13H14H15H
数据12H34H5H67H
  • 思考题:以下是内存地址和存储数据,设DS=10H

  • MOV AL,[10H], AL值为12H 为什么?

    10H中的12H赋值给AL

  • MOV AX,[10H], AX值为3412H 为什么?

    10H中的12H复制给AL,
    11H中的34H复制给AH

    最后AX为3412H

  • MOV AX,[12H] AX值为6705H,为什么?

    12H中的05H放AL,13H中的67H放在AH

    最后结果为6705H

  • 设AX = 6705H时

    • MOV [14H],AL [14H]的值应该是多少?

      AL=05H

      14H=05H

    • MOV [14H],AX [14H]和[15H]的值应该是多少

      [14H]=AL=05H

      [15H]=AH=67H

五、寻址方式

在第二章复习要点已经说的很清楚了

只要再记住寻址方式里的地址全部是表示偏移地址即可。

六、汇编指令

变量的定义P185-188

A DB 0FFH

这边一定要加一个0,不然会报错

带DPU表达式的

DA DB 10H DUP(?)

10H个字节每个存储单元可以是任意值

寻址

重点一、MOV指令注意要点

  • MOV指令即赋值指令,唯一要关心的问题就是MOV的源操作数目标操作数必须类型一致
    • 即如果两个都是寄存器,则必须都是8位寄存器或16位寄存器。
    • 如果是寄存器和变量,必须是8位寄存器对DB变量,16位寄存器对DW变量。
    • 如果是寄存器内存单元地址,则要注意8位寄存器读/写一个内存单元,16位寄存器两个。
  • 另外一个注意的,不能内存单元内存单元之间直接赋值!
  • 包括变量也是内存单元的一种。必须经过寄存器中转

思考题

  • 思考题:以下指令错在哪里?

    ​ MOV AL,BX //寄存器之间赋值类型不一致
    ​ MOV AX,BL //寄存器之间赋值 类型不一致
    ​ MOV AX, A (A 为DB型变量 //寄存器和变量之间赋值 类型不一致
    ​ MOV BL,B (B为DW型变量 //寄存器和变量之间赋值 类型不一致
    ​ MOV [10H],[100H] // 不能在内存单元和内存单元之间赋值
    ​ MOV [10H],A //不能在内存单元和内存单元之间赋值,变量也算内存单元的一种

重点二、取偏移地址指令LEA

  • LEA指令的是变量的偏移地址
    • 注意偏移地址在汇编语言编程中的重要作用。
  • 还有偏移地址必须用16位寄存器来存放,不能用8位寄存器。

思考题

思考题:已知数据段定义如下,请写出AX的值

DATA SEGMENT
A DW 10H,11H
B DB 15H,16H
C DB 15H
DATA ENDS

ABC
10H00H11H00H15H16H15H

LEA AX,A AX=? // 0
LEA AX,B AX=? // 4
LEA AX,C AX=? // 6
LEA AX,[4H] AX=? // 4H

重点三、算术类指令

  • 加减法指令要注意的第一个要点是:两个操作数类型必须相同,和MOV一样

  • 第二个要点:

    • 注意如何使用ADC和两个16位寄存器计算32位数加法(例4-30,P158),

      加上常数76F1A23H

      ADD AX, 1A23H

      ADC DX, 76FH ;带进位加法

    • 如何使用SBB和两个16位寄存器计算32位数减法

      SUB AX 5678H

      SBB DX 1234H ;带借位的减法

思考题

已知一个32位无符号数存放在DX(高16位),AX中,如何计算该无符号数减去12345678H的值?

求相反数指令NEG

  • 注意,NEG只有一个操作数,操作数可以是8位或16位,

  • 是把该数当做补码来求相反数,即把该数按位取反再加1

    (还记得第三章的补码加减法吗?)。看例4-34 P160.

CMP指令

比较两个数的大小

和第五章的条件转移指令一起使用

本质是把两个数相减,看结果是大于0,小于0还是等于0,但是两个数原来的值不变。

乘除法指令

  • 第一个要点:注意乘法指令MUL和除法指令DIV都只有一个操作数!

  • 被乘数/被除数根据指令给出操作数的类型决定

    决定被除数,是DX AX,还是AX

    • 如果操作数是8位寄存器或DB变量

      • 乘法的被乘数为AL——>结果放在AX中。

      • 除法的被除数是AX——>商放AL,余数放AH。

        原理是,从左往右补码除法,左移,向左移动

        逻辑左右移,补0

        算术左移补0,算术右移赋值符号位

    • 如果操作数是16位寄存器或DW变量

      • 乘法的被乘数为AX——>结果放在DX(高16位)和AX(低16位)中
      • 除法的被除数是DX高AX低组成的32位数——>商放AX,余数放DX。

思考题

  • 假设AX=234H, BX=110H DX=0H请问若分别执行:

    • MUL BL后,AX=? BX=? DX=?

      AX=0340H

      BX=0110H

      DX=0000H

    • MUL BX后 AX=? BX=? DX=?

      AX=5740H

      BX=0110H

      DX=2H

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YajLNfzO-1640928640498)(C:\Users\GhostLX\AppData\Roaming\Typora\typora-user-images\image-20211230153006377.png)]

    • DIV BL 后,三个寄存器的值?

      余数AH=04H,商AL=23H,AX=0423H

      BX=110H

      DX=0H

    • DIV BX 后,三个寄存器的值?

      余数DX=14H,

      商低位AX=2H

    逻辑运算指令P166

    记住这几个逻辑运算是怎么算的就可以了,特别是XOR和NOT

  • 移位指令

    只要求逻辑左右移和算术左右移

    • 逻辑左/右移1位,相当于无符号数乘/除2

      SHL AX, CL

      SHL AX, 1

      SHR AX, CL

      SHR AX 1

    • 算术左/右移1位,相当于有符号数(补码)乘/除2。

      SAL AX,CL

      SAL AX,1

      SAR AX,1

      SAR AX, CL

思考题

思考题:

  • 一个无符号数放在AX中,想让AX中该值变为原来的10倍,怎么办?

逻辑右移3位+逻辑右移1位

直接写SHL AX, 3,会报错,CE

SHL AX, 1

MOV DX, AX

SHL AX, 1

SHL AX,1

ADD AX,DX

课本P170做法,在8086兼容指令中,移位指令的后面那个数只能是1或者CL

MOV CX, 3
MOV DX, AX
SHL AX, CL
SHL DX, 1
ADD AX,DX

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A8FXM8c9-1640928640499)(C:\Users\GhostLX\AppData\Roaming\Typora\typora-user-images\image-20211230162910753.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRSRM2Wk-1640928640499)(C:\Users\GhostLX\AppData\Roaming\Typora\typora-user-images\image-20211230163525290.png)]

  • 一个有符号数放在AX中,想让AX中该值变为原来8分之一,怎么办?

    算术右移3位

    MOV CL, 3

    SAR AX, CL

第四章补充

串处理命令的说明:

  • 串处理指令,即自动处理内存中一连串空间操作所用的指令

    • 比如将以某个起始地址开始的连续N个字节的内存数据移到另一个起始地址开始的N个字节中。
    • 或者将某个起始地址开始的字符串另一个起始地址开始的字符串比较,等等。
  • 于是,串处理命令需要注意的细节是:

    • 起始地址的设定
    • 串命令每执行一次过程中发生的操作
    • 重复执行串命令以达到处理一连串内存字节空间

例题

  • 已知STR1为一个字符串“hello world”,在一个起始地址为200H的数据段中,现在要将字符串赋给:

    • 同一个数据段中的另一个变量STR2,STR2原始定义为

      STR2 DB 11 DUP (?)

      11是重复次数,?代表内容是随机的

    • 起始地址的设定:

      • 首先,既然是字符串传送,自然是使用字符串传送指令MOVSB
      • 源串是STR1,目的串是STR2 如何让串操作指令找到源串?
      • 串操作指令DS为源串所在数据段的基地址SI为源串的偏移地址,定位到源串
      • 故要定位到STR1,应该将DS和SI设置为:
        • MOV DS, 20H (记得之前复习要点中提到的基地址定义?)
        • LEA SI, STR1 (LEA是取偏移地址指令,第四章要点有)
    • 如何让串操作指令找到目的串?

      • 串操作指令ES目的串所在数据段的基地址DI为目的串的偏移地址,定位到目的串
      • 故要定位到STR2,应该将ES和DI设置为:
        • MOV ES, 20H(STR2和STR1在同一个数据段中,用相同基地址)
        • LEA DI, STR2
  • 每执行一次串操作指令发生的事:

    • 在设置完源串和目的串的起始地址后,每执行一次MOVSB,实际执行操作如下:

      $MOV\ \ \ [ES10H+DI],[DS10H + SI] $

      SI加1,DI加1

      ES(Extra Segment):附加段寄存器

      DI(Destination Index):目的变址寄存器

      DS(Data Segment):数据段寄存器

      SI(Source Index):源变址寄存器

    • 注意,执行一次MOVSB指令就只执行这些操作。也就是一次MOVSB指令其实只将STR1的一个字节赋给了另一个字符串,然后将SI和DI加1指向STR1和另一个字符串的下一个字节,准备下一次的赋值。

    • 所以,如果要将一个字符串全部赋给另一个字符串,需要多次重复执行MOVSB。那么这个重复怎么设置呢?

重复命令REP

  • REP命令的用法为:

    REP 串处理命令,每执行一次串处理命令,就把CX的值减1,直至CX为0为止。

    故需要对CX赋值,设置重复次数。

  • 以本题为例,要将STR1赋给STR2,由于STR1长度为11(空格也算字符)需要执行MOVSB 11次,所以赋值命令如下:
    (设置好起始地址后)

    mov CX,11
    REP MOVSB

思考题:

请写出完整的将STR1赋给STR2和将STR1赋给STR3的汇编程序。

CMPSB命令与REPE的使用

  • 同样作为串处理指令,CMPSB用于两个字符串比较设置起始地址的方法完全相同,只是CMPSB每一次执行事实上做的是:

    C M P    [ E S ∗ 10 H + D I ] , [ D S ∗ 10 H + S I ] CMP\ \ [ES*10H+DI],[DS*10H + SI] CMP  [ES10H+DI],[DS10H+SI]
    ​ SI加1,DI加1

  • 重复时,CMPSB应当和REPE而不是REP结合使用,即使用方法为:

  • REPE CMPSB,REPE对CX的操作和REP完全相同,

    • 不同的是,当REPE所重复的指令一旦执行结果不为0,就立刻停止重复,即使此时CX不等于0

    • 所以,REPE CMPSB可用于比较两个字符串是否相同,一旦遇到不同的字符,即使CX不为0,重复依然会停止

      (思考题1:为什么会停止?)

思考题2

请自己再独立写一遍实验 字符串比较,看是否真正理解掌握了?

第五章

1.一个完整的汇编程序结构:

注意P182的代码,一个完整的汇编语言需要:
(1)定义数据段:

DATA SEGMENT
………………….
DATA ENDS

(2)堆栈段可以不定义

(3)定义代码段:

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: mov AX,DATA
mov DS,AX 初始化数据段基地址
……………
MOV AH,4C
INT 21H 调用系统函数退出程序
CODE ENDS
END START

代码段重点1:ASSUME

ASSUME建立起段寄存器段名的联系,CS:代码段名,DS:数据段名

重点2:START与END START的位置

  • START的位置在代码段第一条指令的前面
  • END START 在CODE ENDS后面

重点3:记住初始化数据段寄存器

重点4:

  • 程序结束时记得使用4C号函数和INT 21H 退出

2. 数据段定义变量后在内存中的存放形式

重点1 、要求掌握变量类型:DB和DW

DB:占用一个字节,定义2位16进制数
DW:占用两个字节,定义4位16进制数

  • 定义字符串:仅使用DB来定义,每一个字符(包括空格)占用一个字节

  • DW型数据存放和访问遵循高高低低的原则(忘了回去看前面的要点)

  • 连续定义变量,在内存中连续存放

思考题1

假设DS的值是20H(记得乘以十),请画出这个数据段在内存的存放情况

DATA SEGMENT
A DB 11H,
B DW 1234H
C DB 13H,02H
D DW 05H,06H
E DB “AB C!”
DATA ENDS

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UsaDxSS5-1640928640500)(C:\Users\GhostLX\AppData\Roaming\Typora\typora-user-images\image-20211230215800236.png)]

思考题2

  • 注意B,C和D的定义和存放
  • DW型变量必须占两个内存单元,即使值没有4位。
  • 并不是每个数据都要对应一个变量名,使用逗号连接的变量定义虽然连续存放,但是没有变量名对应,那么如何使用204H地址的数据和207H地址的数据呢?
  • 答案是使用变量名来访问,见下一页。

204 MOV AL,A+4

207 MOV AL,A+7

​ MOV AL, A AL = 11H
​ MOV AL, A+1 AL = 34H
​ MOV AL, A+4 AL = 02H
​ MOV AL, C+1 AL = 02H
​ MOV AX, B AX = 1234H
​ MOV AX, B+1 AX = 1312H

比如访问A后面的一个

MOV AL,A+1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KzCKDNhj-1640928640500)(C:\Users\GhostLX\AppData\Roaming\Typora\typora-user-images\image-20211230220555308.png)]

汇编语言中变量的本质:变量名真正的意义是内存单元的一个“标签”,它具有两个属性:

  • 地址属性:变量名本身代表着一个内存地址,而不是内存中的数据。

    注意:是偏移地址而不是物理地址

  • 类型属性:通过变量名去访问内存,访问的内存单元数变量类型一致

    即使用变量A去取内存的数,取一个单元,使用变量B,则取两个单元

思考题:

想想为什么是这些结果?

理解使用变量名来访问内存的方法。注意不同变量类型对应不同大小的寄存器

3. 顺序程序设计

P212例5-1

重点一、注意汇编程序的完整格式

重点二 注意如何利用左移指令和右移指令实现乘10,乘3和除2

乘以10, 左移3 + 左移1

乘以3 左移1 + 原来

除以2 右移1

4、分支程序设计(if-else)

1) 改变指令的执行顺序:

  • 在正常情况下,汇编语言指令是通过修改IP寄存器的值,一条条向下执行的(回想第一章,如何修改的?)

答:

在执行程序时根据寄存器CS和IP的值指向程序的第一条指令地址,然后每读取一条指令,就在IP上加上该指令的长度,即指向了该程序的下一条。

  • 但是,如果要实现if语句或循环语句,就需要改变指令的执行顺序,即指令跳转。

本章所有条件转移语句的工作本质就是修改IP寄存器,使之改变指令执行顺序转移相应语句去执行

转移到指定指令的方法:指令标号

指令标号的形式如下:

标号: 指令

标号的本质指令所在的内存地址

条件转移语句后跟标号,就把ip寄存器的值修改为标号所代表的内存地址,于是就跳到了标号所在的指令作为下一条执行指令

注意:只要求掌握使用跳转语句+标号进行指令转移的方法

2)无条件转移指令JMP

无需任何条件,直接跳转到标号所在位置

通常用于处理不同分支,防止一个分支执行完后继续执行下一个分支:

L1:…………
………… //if ……
JMP end //思考题:如果没有这一句会怎么样?
L2: …………
……………//else
end:…………. //if….else……之后的语句

思考题

上面注释中,如果没有这一句会怎么样?

:如果没有这一句话,则执行完if之后,会顺便执行else

防止一个分支执行完后继续向下执行下一个分支

3)条件转移指令

  • CMP指令与条件转移语句的结合:

条件转移语句工作原理,是以上一条指令的执行结果作为条件,从而决定是否转移到标号所在的指令取执行,因此条件转移指令的上一条指令通常是CMP指令,即比较指令

CMP AX,BX // ZF=1,所以下面执行的条件
JE L1 (如AX与BX相等,转移到L1所在指令执行,否则继续向下执行)

其他J**条件转移指令

​ JA/JAE/JB/JBE L1(如AX大于/大于等于/小于/小于等于BX(作为无符号数),则转移到L1所在指令执行,否则继续向下执行)
​ JG/JGE/JL/JLE L1 (如AX大于/大于等于/小于/小于等于BX(作为有符号数),则转移到L1所在指令执行,否则继续向下执行)

思考题1

求A,B,C三个双字节无符号数中的最大值

​ ………………………(数据段和代码段标准格式自己完成)
MOV AX,A
MOV BX,B
MOV CX,C
CMP AX,BX
JAE L1 若AX>=BX,直接跳到L1,将AX与C比较,否则继续向下执行
MOV AX, BX 将更大的值B放入AX ,与C比较
L1: CMP AX, CX
​ JAE L2 //AX>=CX发生转移
​ MOV AX,CX //同理
L2: MOV MAX, AX
​ …………………………….

DATA SEGMENT
A DW 11H
B DW 12H
C DW 0FFH
MAX DW 0H
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX

MOV AX,A
MOV BX, B
MOV CX,C
CMP AX, BX
JAE L1
MOV AX,BX

L1: CMP AX, CX
JAE L2
MOV AX,CX
L2: MOV MAX, AX

MOV AH,4CH
INT 21H

CODE ENDS
END START

思考题2

思考题2:实现以下函数:

B = 4*A (A>=0)
= -A (A<0)

  • 实现时注意两个要点:

    • 比较大小后的条件判断语句应该使用JG/JGE/JL/JLE而不应该使用JAE,JBE等(因为只有有符号数才有正数负数之分

      因为这边有正负号,所以显然用有符号数

    • 求相反数的指令是NEG

    • 注意两个分支之间应该用一个JMP指令,防止一个分支执行完后继续向下执行下一个分支。

5. 循环程序设计

LOOP语句基本使用方法:

标号: ……………
……………
……………
LOOP 标号

  • 程序即在标号与LOOP 语句之间循环,循环次数为CX的值。
  • 即LOOP每执行一次,CX减1,直至CX为0时停止循环。
  • 故若无特殊必要,不要在循环体中使用CX

思考题:掌握实验 字符串内字符分类

带条件循环语句LOOPE

标号:………………
………………
CMP ……….
LOOPE 标号

循环条件:

  • 1、CX不为0,且每循环一次CX减1,与LOOP相同
  • 2、CMP语句执行的结果为相等

思考题:

例5-8 P223-224,请掌握通过LOOPE在字符串中寻找不满足条件的字符的用法,

注意如何使用寄存器寻址实现扫描字符串

带条件循环语句LOOPNE

用于找字符串中的某个字符。

标号:………………
…………… …
CMP ……….
LOOPNE 标号

循环条件:

    1. CX不为0,且每循环一次CX减1,与LOOP相同
    2. CMP语句执行的结果为不相等

思考题

请思考如何将例5-8改为寻找一字符串中的第一个空格并将其偏移地址送入index

将LOOPE改为LOOPNE

6、子程序的调用

重点1:子程序的定义

定义方式有两种,正规形式

子程序名 PROC (由于仅要求段内子程序,故 不考虑FAR类型)
……………
RET

子程序名 ENDP

子程序名:子程序第一条指令
…………
…………
RET

  • 注意,子程序相当于函数,必须写在代码段当中,建议跟在主程序后面,即

CODE SEGMENT
………….
Call 子程序
…………
MOV AH,4C
INT 21H
子程序:………
…………
RET
CODE ENDS
END START

主程序调用子程序具体操作

主程序中使用CALL调用子程序,子程序中使用RET返回主程序的下一条指令。具体操作如下:

CALL 子程序时,将主程序中CALL指令的下一条指令的地址(即IP寄存器的值)存入堆栈,然后将IP寄存器的值 设置为子程序的第一条指令所在地址。

子程序执行到RET时,取出堆栈顶部的值,即之前CALL指令压进去的IP寄存器的值,也就是主程序中CALL指令的下一条指令的地址

主程序向子程序传递参数的方法

  • 注意,寄存器数据段定义的变量是主程序和子程序通用的,所以可以通过数据段的变量或寄存器传递参数,子程序中修改寄存器和变量的值会直接影响到主程序。

思考题

使用寄存器AX与BX传递参数,并使用AX存放结果,请实现一个 A X = 3 ∗ A X + 0.75 ∗ B X AX=3*AX+0.75*BX AX=3AX+0.75BX的子程序,并在主程序中调用子程序计算 C = 3 ∗ A + 0.75 ∗ B C=3*A+0.75*B C=3A+0.75B (其中A,B是DB型变量)

第六章

多级存储架构

越接近CPU的层次,速度越快,容量越小,单位存储价格越贵。反之,速度越慢,容量越大,单位存储价格越便宜。

为什么需要多级存储体系?

一个高性能的计算机系统要求存储器的容量大,读取速度快,成本低廉,支持复杂的系统结构。但是这些要求往往互相矛盾,形成制约,因此采用多级存储体系。对CPU直接访问的一级,其速度尽量快些,容量可以小一点;作为后面的级别容量尽量大一点,速度可以慢一点。经过合理的搭配和组织,对用户来说,整个存储系统就提供足够大的存储容量和较快的读取速度。

寄存器按作用分类

  • 按照存储器在计算机系统中的作用分类

    从CPU向下的层次依次为:

    高速缓冲存储器——内部存储器——外部存储器。

    • 高速缓冲存储器

      用来存放当前正在执行的程序和数据

      Cache的存取速度可以与CPU的相匹配,但其价格昂贵,存储容量小

    • 内部存储器

      用来存放当前运行所需要的程序和数据

      相对外部存储器而言,内存的容量小、存取速度快

    • 外部存储器

      用来存放当前不参加运行所需要的程序和数据

      容量大,但是读取速度慢,CPU不能直接读写,需要专门的设备读写

  • 按照存储方式来分类

    • 随机存取存储器RAM

      可读可写存储器

      CPU对任一单元的存取时间相同,与存储单元在存储器中的位置无关

      RAM主要用作主存,也可用于高速缓存

存储器容量拓展

  • 内存存储单位芯片是很小的,一个8G内存是由多个小容量存储芯片构成的存储阵列。

  • 小容量存储芯片的表示方式为:

    • X K * Y位,表示该芯片具有X K个Y位的空间。如1K*4位,说明有1K个4位存储空间。
  • 已知一个内存单元是8位的,因此如使用4位的存储芯片,需要用两个1K4位存储芯片,合并成一个1K8位的存储芯片,即常见的1KB存储。

    这种扩展方式即位扩展

  • N个1K*8位的内存芯片可以合成一个NKB的内存,即位字数扩展

思考题

掌握例6-5,如何使用2K8与1K4芯片合并成一个4K的芯片,而且理解图6-5中地址分配的原理。

0000-07FF用2K*8填满

然后两个1k4拼接为一个1K8

用两个1K8位字数拓展为一个2k8,填满0800-0FFF

3. 高速缓冲寄存器

高速缓冲寄存器的组织方式

1、直接映像
  • Cache与主存之间采取直接映像方式,即主存中每一块只能复制到某一块固定的Cache块中
  • 将主存2048块按顺序分为128组,每组16块,分别与Cache的16块直接映像
    • 优点:容易实现
    • 缺点:不够灵活,可能使Cache的存储空间得不到充分的利用
2、全相联映像
  • 主存的每一块可映射到Cache中的任一块。
    • 优点:映像关系比较灵活,主存的各块映射到Cache中的任一块,只需要淘汰掉某一块,即可调入任一块的内容
    • 缺点:不能直接从主存中提取Cache块号,需要主存块标记和Cache各块标记逐个比较,速度很慢。
3、组相联映像
  • 主存的块号跟Cache的组号之间映射
    • 优点:每组有若干可供选择的块,因而较直接映像灵活,每组块数有限,因而代价比全相联映像小

替换算法

先进先出算法(FIFO)
  • 按块调入Cache的先后次序的顺序,即在需要更新时,将最先调入Cache的块内容淘汰
    • 优点:方法简单,容易实现,不需要记录各个块的使用次数,系统开销少
    • 缺点:不合理,有些内容虽然调入早,但是可能仍需使用
近期最少使用算法(LFU)
  • 在Cache的各个块建立一个调查情况记录表,简称LRU目录。当需要替换的时候,将在最近一段时间内使用最少的块内容予淘汰(将其移动到队列最末尾)
    • 优点:访问命中率高,相对合理
    • 缺点:系统开销大

第七章

1、系统总线的分类

  • 系统总线主要分为三类:

    • 地址总线

      地址总线用于传送地址

    • 数据总线

      数据总线用于传递数据

    • 控制总线

      控制总线用于传送控制信号(命令)

2、直接程序控制方式

直接程序控制方式与I/O设备交互的方法

P314三步

  1. 读取外设状态信息

  2. 判断是否可进行新的操作。如果设备尚未准备好,则返回第一步;若已经准备好,则进入下一步

    例如判断键盘是否有新的键按下,或打印机是否准备好接受新数据

  3. 执行所需的I/O操作

    例如从键盘接口读数,或送出打印信息打印机接口

直接程序控制方式的缺陷P316第一段

自己的话说即可

  • 在直接程序查询方式中,CPU的利用率不高,这是因为CPU会对外设执行大量无效的查询

    • 如果CPU采用不断查询的方式,则长期处于等待,不能做别的处理,也不能对其他事件及时做出响应

    • 及时采用定时查询的方法,也不能完全克服上述缺点,因为它仍然存在大量的无效查询

      • 若两次查询的时间间隔选取的较短,则无效查询急剧增加
    • 如果查询的时间间隔选取的较长,也不能对外部状态的改变及时做出响应

      • 若两次查询之间出现多次事件,则会丢失信息

3、程序中断方式

中断控制方式概念:

  • 在接到随机请求后,CPU暂停原来的程序,转去执行中断处理程序,为响应的随机事件服务,处理完毕后CPU恢复原程序的继续执行。

好处CPU既能对事件做出及时响应,又可以避免无效操作提高CPU效率

  • 源程序被中断的位置称为断点
  • 用于处理该时间(读键)的程序称为中断处理(服务)程序
  • 保存被中断的位置称为保存断点
  • 在中断处理程序中要保存源程序的寄存器内容,称为保护现场
  • 中断处理程序即将结束前要恢复这些寄存器的内容,称为恢复现场
  • 中断处理程序,又称为中断处理子程序
  • 被打算以后又恢复执行的原程序,又称为主程序

中断入口地址生成

  • 中断向量法:即根据中断号,在内存的指定位置 (中断向量表)到存放中断处理程序的地址

    将地址赋给IP和CS即可转向中断处理程序执行

    注意中断向量表的位置:内存物理地址0-3FFH,每一个中断处理程序的地址需要用4个字节来存,

    前两个字节存IP值,后两个字节存CS值。

    故N号中断的中断处理程序的地址存放在内存物理地址4N+1,4N (组成16位IP)4N+3,4N+2(组成16位CS)

    注意地址组成同样遵循高高低低的原则。

思考题

已知内存地址84H,85H,86H,87H分别存储1AH,2BH,3CH,4DH,请问执行汇编语言指令 INT 21H调用系统中断时,CS和IP的值为?

因为21H*4=84H

即4N

IP=2B1AH

CS=4D3CH

中断响应与中断返回的过程

中断响应周期中的操作
  • P322第三点
  • 中断类型码*4=中断向量表中的向量地址
  • 向量地址连续4个字节代表中断服务程序的入口
  1. CPU每执行完一条指令后,通过有关控制逻辑判断是否有中断请求

  2. 进入中断响应周期

    在源程序和中断处理程序之间,INTA周期

    • 首先根据中断允许标志IF判断是否响应,如果IF为1则响应中断,
      • 然后进入INTA周期,另一方面向外发出应答信号INTA
    • 外部的中断控制器受到该信号后,发出请求的中断源中断类型码,到CPU数据总线,在CPU在撤销INTA信号前,取走中断类型码
  3. CPU在响应周期执行以下操作

    • 将标志寄存器FLAG的内容压入堆栈

    • 保护断点,将CS:IP的值压入堆栈

    • 中断允许标志清零IF=0(关中断)

      其他中断就没办法再执行了

    • 单步中断标志TF清零TF=0

      即1号中断

中断返回中进行的操作
  • 返回主程序后先恢复现场,将保存现场时压入堆栈的寄存器内容从堆栈中弹出,送回原寄存器

  • 执行中断返回指令IRET:IP出栈,CS出栈,FLAG出栈

    跟普通的RET指令相比,就多了一个FLAG出栈

4、DMA方式

DMA的基本思想

  • DMA方式是为了在主存储器与I/O设备之间进行告诉批量数据交换而设置的,它的基本思想是

    通过硬件控制实现主存与I/O设备间的直接数据传送,在传送过程中无需CPU程序干预

DMA工作结束后通知CPU的方式:中断请求

例7-3到7-6 采用DMA方式的几种情况。

  1. 用于磁盘接口
  2. 用于网络通信接口
  3. 用于动态存储器刷新
  4. 用于高速数据采集接口

5、通道

  • 通道具有自己的通道指令、自己的局部存储器处理器IOP),因此可以独立完成复杂的I/O管理和预处理
  • 很大程度上减少了CPU的I/O管理负担,提升了系统效率

通道的工作方式与特点,和中断、DMA的不同

P348

与中断相比
  • 相同点:都以程序方式进行I/O管理功能性强、灵活性强
  • 不同点:但是通道不需要CPU执行中断处理程序,完全取代主CPU去管理I/O操作,使主CPU的效率大大提高
与DMA相比
  • 相同点:二者在进行数据传送时,都可直接访问主存,不需要CPU程序干预
  • 不同点:DMA依靠纯硬件控制传送,只能实现简单的传送;而通道则可以通过通道程序实现复杂的操作
  • 因而可以认为:通道方式是在DMA方式的基础上面发展起来的、功能更强的一种I/O管理方式,它常常覆盖DMA方式。
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值