第二章 寄存器
8086有14个寄存器,分别为AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。
2.1 通用寄存器
8086CPU的所有寄存器都是16位,可以存放两个字节。 AX
, BX
, CX
, DX
这四个寄存器通常用来存放一般性数据,被称为通用寄存器
为了兼容之前的8位通用寄存器,将这4个寄存器拆开为8个8位寄存器分别为
H的含义High,高位,L的含义Low,低位
- AX=AH+AL
- BX=BH+BL
- CX=CH+CL
- DX=DH+DL
2.2 字在寄存器的存储
因为..x8086架构的原因,未来的字长都指的的是16位(8086机器的一个寄存器大小)
2.3 几条汇编指令
mov ax,18
mov ah,78
add ax,8
mov ax,bx
add ax,bx
寄存器的名称不区分大小写
-
若AX=00C5H,执行add al,93H 后等于多少呢
我原来以为可以变成0158H,看答案才知道因为只是al相见,所以进位必须舍去
答案为0058H
2.5 16位结构CPU
为什么叫16位呢?
- 运算器一次最多处理16位的数据
- 寄存器的最大宽度为16位
- 寄存器和运算器之间的通路为16为
2.6 8086CPU给出物理地址的方法
问题:8086有20位数据总线(1MB寻址能力),但是它是16位CPU内部总线(64K),只能送出16位地址,如何解决?
解决:通过内部用两个16位地址合成的方法来形成一个20位的物理地址
物理地址=段地址*16+偏移地址
本质不过就是扩大了4位而已,变成了20位。
为什么只用20位呢?因为地址总线只有20位。
内存并没有分段,但是CPU给内存分了段。分段方式管理内存
所以实际可能描述内存地址,用这样的方式 2000:1F60单元
代表内存的2000段中的1F60单元
- (基础地址=段地址*16)
- (物理地址=基础地址+偏移地址)
2.7 段寄存器
8086有4个段寄存器: CS
, DS
, SS
, ES
。
2.8 CS和IP
-
基本定义
CS
和IP
是8086CPU中最关键的两个寄存器,他们指示了CPU当前要读取指令的地址。CS
位代码段寄存器,IP
为指令指针寄存器,**任意时刻**CPU将CS:IP所指向的内容当做指令执行 -
执行过程
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器。
- IP=IP+所读取指令的长度,从而指向下一条指令
- 执行指令,转到步骤(1),重复这个过程
在8086CPU加电启动或复位后 (即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H。即在8086PC刚启动,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元的指令是8086PC机开机执行后的第一条指令
2.11 修改CS,IP的指令
-
不能用mov指令
jmp 段地址:偏移地址
jmp 2AE3:3 //执行后 CPU将从2AE33H处读取指令
jmp 某一合法寄存器(用寄存器给IP复制)
jmp ax//执行前 ax=1000H,CS=2000H,IP=0003H
//执行后 ax=1000H, CS=2000H,IP=1000H