微机 8086 寄存器 存储器 寻址 段地址 有效地址

前言 ´・ᴗ・`

  • 本节主要以8086为例讲了CPU的一些内置寄存器及其作用 不要求记住 因为只有用到的时候这些名称才更加有意义
  • 笔者在玩嵌入式的时候 比如stm32 涉及深入的硬件debug 就遇到了内部寄存器级别的问题 所以这个也算是对嵌入式的铺垫
  • 本篇内容将会帮助你学习…
    • 0 8086 CPU的基本结构
    • 1 Intel 8086 寄存器种类 作用
    • 2 寄存器之间部分相互联系
    • 3 存储器 内存的CPU寻址方法

微机系统的构成

这里我们提纲挈领的明白 接下来我们学习的部分到底是属于哪里
大部分简单的单片机乃至复杂的PC 其实组成结构都是相近的 可以说都从那个简单的8086进化而来
意味着我们掌握8086 就可以一通百通
姑且给简单的计算机(现在就是嵌入式的单片机了)起个名字:微机

  • 微机系统
    • 硬件系统
      • 主机(master)
        • CPU
        • 存储器
        • IO 接口
        • 总线 Bus
      • 外设 perpherial
    • 软件系统
      • 系统软件(OS操作系统自带的)
      • 应用软件 就是我们自己安装的

接下来的部分 聚焦 CPU以及与存储器的联动

外设

外设(perpherial 直译 外围的 相对于CPU当然是外围的) 就是我们CPU控制的外围设备

简单而言 你用树莓派控制一个LED灯 你可以认为树莓派是CPU LED灯是外设
这两者的桥梁就是一个接口(interface)(所谓IO 输入输出接口)
让灯亮 就是CPU控制接口 赋予+5V(打比方)
当然 外设除了我们给它供电的(灯 舵机)
也有反馈信息的 比如传感器(sensor)
所以 接口可以接受信息 所谓输入输出接口
(当然 设置这个接口的功能是输入还是输出 是推挽输出还是端口复用 都是我们编程序控制的)

所以CPU和外设的关系可以简单地看成这样:
在这里插入图片描述
接口有很多种 为了适用于 或者说驱动(drive)不同的外设 这里大致看看了解就好
在这里插入图片描述

CPU 结构

物理意义上 就是分为内部与外部

  • 外部:
    在这里插入图片描述
    • 地址总线address bus
      在这里插入图片描述
    • 数据总线data bus
      在这里插入图片描述
    • 控制总线control bus
      在这里插入图片描述
    • 总线宽度的影响
      在这里插入图片描述
      内部:
      在这里插入图片描述
      在这里插入图片描述

CPU结构 单元化 功能性的视角

实际上 我们嵌入式等常见的应用(各种调试工具)看待CPU 都是以功能的角度看待其内部结构的
我们可以理解CPU为大型机房 自然机房里面有很多服务器 类似一个个单元(unity)
CPU也是如此 由一个个单元组成 其中

名称 英文 中文
EU execution 执行单元
ALU arithmetic 算术单元
BIU bus interface 总线接口单元

在这里插入图片描述
我们之前说 接口是CPU与外设的桥梁
而CPU内部与接口对接的就是BIU 总线接口单元

注意 我们常常说CPU做了什么 其实具体实现,是靠这一个个单元,他们功能几乎相同,所以我们抽象出一个集合体。就类似 阿里的服务器机房 是响应所有访问阿里服务的请求的主体 具体干活的是服务器 不是机房

执行单元

执行单元就是执行我们汇编程序的第一站 类似CPU处理程序的接口

比方我们做一个加法运算 汇编可能就写

mov ax, 0EA04H      
mov bx, 4ae0H     

add ax, bx

在这里插入图片描述
注意图上那个AH AL 那就是16位寄存器AX的高8位和低八位
也就是 我们的加数 都在通用寄存器里面存着呢
那么EU 包含的东西 就是我们汇编程序里面的参数 操作指令等 可谓是与程序最相关的单元

当然 EU只是执行了 解释程序的功能 也就是把参数放好 指令放好(放到寄存器里面方便BIU的进一步操作)

BIU

BIU就是接手EU工作的 它调用EU之前修改的寄存器(EU把程序参数存放好了) 然后具体的去找
比如 找指令 找立即数
这个“找”的过程 就是寻址 寻找地址 然后去使用

之后 把运算结果通过 外部总线(就是这条线与接口相连),再通过接口 最终传到外设上 比如传递高电平 灯就亮了

有没有注意一个好玩的事情:我们所有寄存器都是16位的 那么 20位的地址 到底怎么出来的呢?地址加法器扮演一个什么角色?

我们可以利用两个16位的寄存器值相加 得到20位
当然不是直接相加 可以移位操作一波
这就是8086寻址的基本套路 后面会细讲

所谓的“两个“寄存器 一个是 段寄存器(segment register),一个是专用寄存器
听起来有点奇怪 其实就是 存储器太大了 我们将它分段处理 非常类似我们硬盘的分区
那么我们找数据就是 先定位分区(我们就用到段寄存器的值),
定位分区后,内部定位,就需要知道具体是多少字节到多少字节,比如000FF - 字节 00FFF是存放电影的,打比方 ,这就是指针寄存器的值了
你可以和 在一栋楼里面去找你女朋友为例
整栋楼是存储器 我们分成10段 也就是10层楼
具体在几楼 请看段寄存器的值 比方说是5楼
到了5楼 哪个门牌号呢?
请看指针寄存器的值 比方说01
那么 地址就是 501

接下来我们会细讲 具体有哪些 指针寄存器和段寄存器 分别用在哪些场合

寄存器

相信前面在BIU EU中看到了不少寄存器了
我们将寄存器大致分下类:

  • 通用寄存器 general purpose —— 存储任何指令的地址和数据的寄存器
    • AX adder 累加寄存器
    • BX base 基址寄存器
    • CX count 计数寄存器
    • DX data 数据寄存器
  • 专用寄存器 —— 与段寄存器合作 完成寻址
    • 指针寄存器
      • IP instruction point 指令指针寄存器
      • SP stack 堆栈指针寄存器
    • 变址寄存器
      • SI source 源变址寄存器
      • DI destination 目标变址寄存器
  • 段寄存器 segment
    • CS code 代码段寄存器
    • DS data 数据段寄存器
    • ES extra 附加段寄存器
    • SS stack 堆栈段寄存器
  • 标志寄存器 FLAGS 也就是flag
    • 作用
      • 反映指令执行结果(比如做加法 是否进位 是否溢出等)
      • 控制指令形式
    • 构成
      • 状态标志
        • CF carry 进位 标志位
        • OF overflow 溢出 标志位
        • ZF zero 结果是否为零
        • SF sign 符号
        • PF 结果的奇偶性
        • AF auxiliary 辅助进位(不用管)
      • 控制标志
        • DF direction
        • TF trap

存储器组织结构 寻址方式

前面稍微提到 是专用寄存器与段寄存器的合作 产生20位地址 才能进行寻址 接下来看表:

寄存器名称 举例 地址名称 形象描述
段寄存器 CS DS ES SS 基地址 段地址 女朋友住几楼
专用寄存器 IP SP SI DI 偏移地址 有效地址(EA) 女朋友家门牌号

我们用16位的段地址 指示数据在哪一段 总共有16段
用16位的偏移量 也就是门牌号 指示 数据具体位置相对于每一段的开头 偏移了多少
比如 门牌号510的偏移量是10,因为 相对于每层楼的开头500,差了10户人家
偏移量也称为有效地址(EA)
那么 具体16位的EA 能够对应多少户人家呢?答案是216 B = 64KB
所以 一段(segment)= 64KB 也就是大概64000户人家

这里 也把 段地址:有效地址 称为逻辑地址 就是一种键值对
而真正得到的数据地址 也就是女朋友门牌号 称为物理地址
一个物理地址可以对应多个逻辑地址 反过来 一个逻辑地址对应一个物理地址
因为 逻辑地址 通过 加法 得到物理地址 加法组合无穷 结果唯一

具体操作 我们就会
段地址*16 + 有效地址 = 物理地址
乘16是为了 将段地址 左移4位
在这里插入图片描述
当然 物理地址还可以继续划分 毕竟要寻址的内容特别复杂 可能是指令 可能只是个数据 我们大致这么分类:

  • 取指令寻址 CS+IP
  • 堆栈寻址
    • SS+SP
    • SS+BP
  • 存储器寻址
    • DS+SI
    • DS+DI

总结 ´◡`

本篇从 8086 CPU的基本结构 深入到结构中的各种 寄存器种类 作用
以及·寄存器之间部分相互联系
最后 讲了寄存器关系中重要的协作部分——用于寻址

这些是我其他学习的部分 希望能帮到你

  • 想学习数据库嘛? 不妨从MySQL入手
    MySQL专栏

  • python这么火 想要深入学习python 玩一下简单的应用嘛?可以看我专栏 还在持续更新中哦:
    python应用

  • 小孩子才做选择 大人全都要!对后端感兴趣吗?收下它吧:)
    手把手带你学后端(服务端)

  • 谢谢大佬支持! 萌新有礼了:)

发布了52 篇原创文章 · 获赞 57 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43178828/article/details/104629084