寄存器
1 CPU
2 概述
2.1 8086CPU有14个寄存器 它们的名称为:
2.2 字
| 一个字由两个字节构成
关于数制的讨论
- 由于一个内存单元可以存放 8位数据,CPU中的寄存器又可存放 n 个 8位数据。也就是说,计算机中的数据大多 是由1~N个8位数据构成的。
- 用十六进制来表示数据可以直观的看 出这个数据是由哪些8位数据构成的。
| 存储方式
寄存器中
内存中
字的存储
字的传送
3 物理地址
3.1 意义
3.2 定义
3.3 内存单元地址的形成
16位结构的CPU
16位结构描述了一个CPU具有的特征
8086有20位地址总线,可传送20位地址,寻址能力为1M。
8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。
段地址和偏移地址
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
地址加法器合成物理地址的方法:
本质含义
- (1)从学校走2826m到图书馆。这2826可以认为是图书馆的物理地址。
- (2)从学校走2000m到体育馆,从体育馆再走826m到图书馆。
- 第一个距离2000m是相对于起点的基础地址;
- 第二个距离826m是将对于基础地址的偏移地址
段地址*16可以看做基础地址
段的概念
错误认识:
其实:
在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
注意
由段地址×16引发的讨论
观察移位次数和各种形式数据的关系:
3.4 内存地址空间表示
[bx]
定义
要完整地描述一个内存单元,需要两种信息
我们用[0]表示一个内存单元时,0 表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出
[bx]同样也表示一个内存单元,它的偏移地址在bx中,比如下面的指令
描述性符号“()”
使用一个描述性的符号 “() ”来表示一个寄存器或一个内存单元中的内容
(X)的应用
- (1)ax中的内容为0010H,我们可以这样来描述:(ax)=0010H;
- (2)2000:1000 处的内容为0010H,我们可以这样来描述:(21000H)=0010H;
- (3)对于mov ax,[2]的功能,我们可以这样来描述:(ax)=((ds)*16+2);
- (4)对于mov [2],ax 的功能,我们可以这样来描述:((ds)*16+2)=(ax);
- (5)对于 add ax,2 的功能,我们可以这样来描述:(ax)=(ax)+2;
- (6)对于add ax,bx的功能,我们可以这样来描述:(ax)=(ax)+(bx);
- (7)对于push ax的功能,我们可以这样来描述:(sp) = (sp)-2 ((ss)*16+(sp))=(ax)
- (8)对于pop ax 的功能,我们可以这样来描述:(ax)=((ss)*16+(sp)) 、(sp)=(sp)+2
约定符号idata表示常量
我们在Debug 中写过类似的指令:mov ax,[0],表示将 ds:0 处的数据送入ax中。指令中,在“[…]”里用一个常量0表示内存单元的偏移地址。以后,我们用idata表示常量。
比如
- mov ax,[idata]就代表mov ax,[1]、mov ax,[2]、mov ax,[3]等。
- mov bx,idata就代表mov bx,l、mov bx,2、mov bx,3等。
- mov ds,idata就代表mov ds,1、mov ds,2等,它们都是非法指令。
指令
mov ax,[bx]
mov [bx],ax
[bx+idata]
-
在前面,我们可以用[bx]的方式来指明一个内存单元, 我们还可以用一种更为灵活的方式来指明内存单元
-
[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata)。
-
我们看一下指令mov ax,[bx+200]的含义:
-
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为bx中的数值加上200,段地址在ds中。
-
数学化的描述为: (ax)=((ds)*16+(bx)+200)
-
指令mov ax,[bx+200]也可以写成如下格式(常用):
[bx+si]和[bx+di]
SI和DI
SI和DI是8086CPU中和bx功能相近的寄存器,SI和DI不能够分成两个8 位寄存器来使用。
下面的三组指令实现了相同的功能:
下面的三组指令也实现了相同的功能
使用
在前面,我们用[bx(si或di)]和[bx(si或di)+idata] 的方式来指明一个内存单元,我们还可以用更灵活的方式:
[bx+si]和[bx+di]的含义相似,我们以[bx+si]为例进行讲解。
我们看下指令mov ax,[bx+si]的含义:
指令mov ax,[bx+si]的数学化的描述为:
该指令也可以写成如下格式(常用):
[bx+si+idata]和[bx+di+idata]
[bx+si+idata]和[bx+di+idata]的含义相似,我们以[bx+si+idata]为例进行讲解。
[bx+si+idata]表示一个内存单元
指令mov ax,[bx+si+idata]的含义:
数学化的描述为:
指令mov ax,[bx+si+idata]:
4 种类
4.1 通用寄存器
AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。
为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。
寄存器的逻辑结构(AX)
16位
8位
8086CPU的8位寄存器存储逻辑
8086CPU的16位寄存器分为两个8位寄存器
8086CPU的8位寄存器数据存储情况
4.2 段寄存器
段寄存器就是提供段地址的
8086CPU有4个段寄存器:
CS和IP
CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
8086PC工作过程
- (1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;
- (2)IP = IP + 所读取指令的长度,从而指向下一条指令;
- (3)执行指令。 转到步骤 (1),重复这个过程。
- 在 8086CPU 加电启动或复位后( 即 CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令