8个通用寄存器
|
|
16 bit |
|
|
accumulate |
ax |
ah |
al |
R0 |
count |
cx |
ch |
cl |
R1 |
data |
dx |
dh |
dl |
R2 |
base |
bx |
bh |
bl |
R3 |
stack |
sp |
|
R4 |
|
stack base |
bp |
|
R5 |
|
source |
si |
|
R6 |
|
destination |
di |
|
R7 |
一.存储器的分段管理
1. 8086有20条地址线,最大可寻址范围0 ~ 2^20 - 1,即00000 ~ FFFFF,可寻址1M内存。
2. 8086将1M的存储空间分成多个段,每段最大64KB,范围0000 ~ FFFF。采用物理地址=段地址+偏移地址的方式访问地址:reg * 10h + offset。例如要访问地址12345h,表示为1234:0005,实际地址为1234h * 10h + 5 = 12345h。也可以表示为1230:0045,即1230h * 10h + 45h = 12345h。
- 因此,一个物理地址可以有多种表示方法,称为有多个逻辑地址。
二. 段寄存器
段寄存器(CS, DS, ES, SS)用于存储段地址,当访问内存数据时,需要先规划好段地址。
- CS :Code Segment 代码段,CS:IP取得下一条要执行的指令,CS存放代码段的段地址,IP存放下条指令的偏移地址。
- DS :Data Segment数据段,例如11AD:875为止存在一个字符串,想显示它,需要确保DS的值为11AD。DS不是通用寄存器,所以不能用mov指令直接赋值,要通过通用寄存器中转一下。先mov ax, 11AD再mov ds, ax,随后可调用int 21中断显示字符串。
- SS :Stack Segment堆栈段,SS:SP取得栈顶数据,SS存放堆栈段的段地址,SP存放栈顶的偏移地址。
- ES :Extra Segment附加段,附加段是附加的数据,也用于数据的保存。串操作指令将附加段作为其目的操作数的存放区域。
- 随着发展,80386 处理器增加了FS和GS,也是附加段,它们没有缩写。
三. 段超越前缀指令
没有指明时,一般的数据访问在DS段,但也可以指令访问哪个段。
例如mov ax, [2000]默认访问DS:[2000],
mov ax, ES: [2000]则访问ES:[2000]。
但要注意写法,先写前缀:
例如写了以下代码:
可见mov ax,[2000]指令的机器码相同,只是多了段超越前缀,每个前缀只影响下面的一条指令。
四. 机器码格式
- mov指令
将每条指令机器码的前2字节转成二进制,发现前半部分固定的是指令,后半部分是寄存器编号:
指令 寄存器
10111 000 ax
10111 001 cx
10111 010 dx
10111 011 bx
10111 100 sp
10111 101 bp
10111 110 si
10111 111 di
五. 流水线
图中是一个简单的流水线,除了刚启动时,之后取址和译码可以在同一时间都运行,提高了效率。
流水线设计有长流水线和多流水线,长流水线任务切分细,设计简单,但是如果指令预测失败,已完成的任务都白费,付出的代价高。多流水线任务切分粗,设计复杂,需要额外管理成本,但是如果指令预测失败,付出的代价低相对较低。