汇编语言与接口技术第二章 80x86微处理器

汇编语言与接口技术第二章 80x86微处理器

8086的内部结构之寄存器

寄存器

寄存器相较于存储器有更快的存取速度且易于操作。

根据功能可以将寄存器分为通用寄存器,段寄存器,专用寄存器。

  • 通用寄存器:传,存数据,可以参与逻辑运算。

    MOV AX ,BX ; 传数据
    MOV AX,1234H ; 存
    ADD AX,BX
    INC AX; 参与预算并保存结果
    
    ; BP,SP 一般用于维护站内数据 存栈指针 最经典的是在进行函数跳转时保护主程序数据不变
    PUSH BP; 压入栈底
    MOV BP,SP; 存原来的SP保护SP
    .....
    .....
    MOV SP,BP; 复原SP
    POP BP; 复原BP
    RET ; 推出子函数
    ;可参考 :https://blog.csdn.net/bagboy_taobao_com/article/details/7370504
    ; SI DI 一般在寻址时存放偏移地址。
    

    通用寄存器有AX,BX,CX,DX,SI,DI,BP,SP共八个

  • 段寄存器

    存放段地址的寄存器,有CS,DS,SS,ES

  • 控制(专用)寄存器

    IP,FLAG

其中通用寄存器又可以进一步细分

  • 数据寄存器(AX,BX,CX,DX)
  • 段寄存器(DS,CS)
  • 指针寄存器(SP,BP)

它们更多的作用和分类参考这个,写的非常好。

为了考试,重点掌握数据寄存器和指针寄存器内容,上面博客已经足够。

FLAG标志寄存器

每一位有特定作用,用来辅助进行逻辑有运算。共9个。

名称 符号
溢出标志 OF
进位标志 CF
零标志 ZF
符号标志 SF
奇偶标志 PF
中断标志 IF
辅助进位标志 AF
跟踪标志 TF

其中前四个重点掌握之后了解即可。

溢出标志和进位标志

无符号数才有进位(CF),有符号数才有溢出(OF)。学习过半加器全加器之后,很容易明白,如果我们要计算两个16位数的和,就要把两个半加器级联起来,此时对于低八位就是所谓无符号数,如果向上进一就是往高八位进一,也就是所谓进位(CF = 1),如果高八位向上进一,就超出了16位的最大表示范围,也就是所谓的溢出(OF = 1)。这样我们把低八位看出无符号数,高八位看成有符号数也非常自然了。

因此,它们都是根据是否超出自己应有的范围决定的。这个范围取决于是什么类型的数字,这个图表示的很明确:

这里写图片描述

总之,把两个数看成无符号数才可以判断CF,看成有符号数才可以判断OF。考试时用如下判断方法基本就够了。

以下以8位寄存器为例

判断CF:

  1. 把二进制数化成无符号的十进制数,求得结果,如果超出了[0,255],CF = 1
  2. 直接二进制计算,如果出现第九位,CF = 1

判断OF:

  1. 把二进制转换为有符号十进制数,如果结果超过了[-128,127],OF = 1
  2. 直接二进制计算,如果符号位发生改变,OF = 1

有几个简单的推论,首先CF = 1,计算结果是正确的,OF = 1计算结果是错误的,这个通过上面全加器的例子很容易明白。

其次,OF = 1,仅可能出现在这两个数都是正数或者都是负数的情况,否则根本不会超范围,OF始终为0。


之后的ZF看是否为0,SF看是否为负,PF看是否有偶数个1(用于奇偶校验)了解即可。

存储器

存储器是一段连续的区域,地址从0开始,寻址范围受到地址总线的约束,我们主要讨论的8086cpu的地址总线有20根,故而其寻址能力是$$2^{10}$$。

需要了解两个重要概念。存储单元,存储器的基本单元,大小是1字节或者1字,8086的存储的单元是1字节。物理地址,存储单元的唯一编号。

CPU与存储器的交互过程

首先来看它们之间的连接结构,CPU和存储器需要完成数据的交互,因此一根可双向传递的数据总线。CPU要存放或者取出的数据在哪一个存储单元?这由地址总线传达给存储器,要求存储器准备好对应数据。这个过程的时机,数据总线是写入还是读出,都需要控制,所以还有控制总线,

接下来看具体工作过程。

  1. 控制总线发出访存请求,作用是打开存储器,允许它们进行信息交互
  2. 地址总线发出需要的地址,由存储器经过译码,寻址后准备好数据。
  3. 控制总线发出读写命令,存储器接受后,进行对应的读写操作。
  4. 数据总线将数据传入或传出CPU。

注意:译码,寻址操作都由存储器完成。

CPU对存储器的分段管理

因为地址总线有20根,但寄存器最大也只有16位,因此对于物理地址超过0FFFFH的存储单元,就很难表示,就有了分段的方式对存储器的划分。

这只是CPU对存储器的一种管理方式,并不是物理意义上的将存储器切开,而是逻辑上的将存储器划分为若干段。

划分方式

先将存储器分若干段,再将每个段中地址赋以对应的偏移量。类似于二维数组的思想,先找到某“行”再找到某“列”。

学会它首先明确几个概念。

  1. 物理地址:如上所述
  2. 段地址:物理地址的高16位
  3. 偏移地址(有效地址EA):相对于段首址的偏移量。
  4. 逻辑地址:段地址和偏移地址的连携表示,形如DS:EA

我们可以通过,段地址 * 16 + 偏移地址 = 物理地址,的公式得到物理地址。也可以看出段地址的物理地址一定是16的倍数。

另外,如果在十六进制下乘16等价于左移1位,在二进制下等价于左移4位。

划分段特点

这一个个划分出来的逻辑段是可以重叠的。

最大的划分数量是每16个单元划分一个段,最大有\(2^{20} \div 16=2^{16}=64KB\) 个。

最小划分数量是每 \(2^{16}\) 个单元互粉一个,共16个。

同一个物理地址对应的逻辑地址是不唯一的,根据划分方式的不同而不同。

CPU的内部结构和工作时序

了解性内容,包括8086的40个引脚作用,最大最小模式,最小模式下的读写时序等,有时间的话单开一篇总结。

posted @ 2022-02-12 00:37  Mxrurush  阅读(236)  评论(1编辑  收藏  举报