汇编语言 学习记录 - 02 - 寄存器

CPU的组成

一个典型的CPU由运算器、控制器、寄存器等器件构成,并由内部总线相连。

内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其它器件的联系

总结即是在CPU中:

  • 运算器进行信息处理;
  • 寄存器进行信息存储;
  • 控制器协调控制各种器件进行工作;
  • 内部总线实现CPU内各个器件之间的联系,在它们之间进行数据的传送

对于汇编程序员而言,CPU的主要研究器件是寄存器。寄存器是CPU中程序员可以用指令读写的部件,通过改变各种寄存器中的内容来实现对CPU的控制。

8086CPU的寄存器:

  • 8086CPU有14个寄存器:
    • 通用寄存器:AX、BX、CX、DX
    • 变址寄存器:SI、DI
    • 指针寄存器:SP、BP
    • 指令指针寄存器: IP
    • 段寄存器:CS、SS、DS、ES
    • 标志寄存器:PSW
  • 共性
    • 8086CPU所有的寄存器都是16位的,可以存放两个字节

通用寄存器

一般用于存放一般性的数据。
以AX为例:
一个16位寄存器可以存储一个16位的数据,可存放2个字节。
一个16位寄存器所能存储的最大值为2^16 -1。

8086上一代CPU中的寄存器都是8位的,为了保证程序的兼容性,通用寄存器均被分为两个独立的8位寄存器使用:

  • AX可以分为AH和AL
  • BX可以分为BH和BL
  • CX可以分为CH和CL
  • DX可以分为DH和DL

字在寄存器中的存储

  • 字节(byte):一个字节由8个bit组成,可以存在8位寄存器中。
  • 字(word):一个字由两个字节组成,这两个字节分别称为这个字的高位字节和地位字节

8086是16位CPU,8086的字长(word size)为16bit。
一个字(word)可以存在一个16位寄存器中:

  • 这个字的高位字节存在这个寄存器的高8位寄存器
  • 这个字的低位字节存在这个寄存器的低8位寄存器

物理地址

CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有一个唯一的地址,即就是物理地址。CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。

16位结构中的CPU

16位结构的CPU具有以下几方面的结构特性:

  1. 运算器一次性最多可处理16位的数据;
  2. 寄存器的最大宽度为16位;
  3. 寄存器和运算器之间的通路为16位

8086CPU(16位结构CPU)具有20位地址总线,可传送20位地址,寻址能力为1M,根据以上结构特性,8086CPU寻址能力也只有64KB,处理这两者的寻址空间矛盾方法即是:用两个16位地址(段地址、偏移地址)合成一个20位的物理地址。

地址加法器合成物理地址的方法:物理地址 = 段地址 x 16 + 偏移地址

在段地址现有的16位基础结构上,左移4位(2^4 Byte),再与偏移地址相加,就可得到20位的物理地址。

本质含义

CPU在访问内存时,用一个基础地址(对于8086CPU是段地址×16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。

内存的分段表示

这里的段地址,并不是内存被划分成了一个一个的段,每一个段有一个段地址,它而是来自于CPU的划分。

段地址在计算时,并不唯一固定,同一段内存,具有多种分段方案,即CPU可以用不同的段地址和偏移地址形成同一个物理地址。
举例:8086CPU访问物理地址为123C8H的内存单元:

(1)段地址×16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数;
(2)偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K。

偏移地址16位,变化范围为0 ~ FFFFH,用偏移地址最多寻址64KB。
例:给定段地址2000H,用偏移地址寻址的范围是:20000H ~ 2FFFFFH,共64K。

存储单元地址的表示方法:
数据在21F60H内存单元中,段地址是2000H,说法
(a)数据存在内存2000:1F60单元中;
(b)数据存在内存的2000H段中的1F60H单元中。

段地址在汇编中很重要,CPU会用专门的段寄存器存放段地址:

  1. CS - 代码段寄存器
  2. DS - 数据段寄存器
  3. SS - 栈段寄存器
  4. ES - 附加段寄存器

CS 与 IP

CS:代码段寄存器
IP: 指令指针寄存器
CS:IP:CPU将内存中CS:IP指向的内容当作指令执行

8086PC工作过程的简要描述:
(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;
(2)IP = IP + 所读取指令的长度,从而指向下一条指令;
(3)执行指令。 转到步骤(1),重复这个过程。

实例:

mov ax, 0123H
mov bx, 0003H
mov ax, bx
add ax, bx

若内存中有数据 B8 23 01 BB 03 00 89 D8 01 D8,究竟用作一般数据,还是用作指令?CPU将CS:IP指向的内存单元中的内容看作指令。

如有错误,欢迎评论指正🤝

posted @ 2022-06-20 02:56  Zerimon  阅读(131)  评论(0编辑  收藏  举报