1.通用寄存器

8086CPU所有一共有14个寄存器分别是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW,所有的寄存器都是16位的,可以存放两个字节(一个字)。

AX、BX、CX、DX通常用来存放一般性数据被称为通用寄存器。

AX通用寄存器存储二进制方式为:

Android中寄存器 寄存器ax_Android中寄存器

 

为了保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。

1)AX可以分为AH和AL,分别是高8位和低8位

2)BX可以分为BH和BL

3)CX可以分为CH和CL

4)DX可以分为DH和DL

Android中寄存器 寄存器ax_寄存器_02

 

那如何向下兼容8位寄存器呢?就是将AH全部填0,只用AL部分。

AX的低8位(0~7位)构成了AL寄存器,高8位(8~15位)构成了AH寄存器。

AH和AL寄存器是可以独立使用的8位寄存器。如何不能独立使用那么就不能兼容。

 

2.几条简单的汇编指令

汇编指令不分大小写

下面是几条简单的汇编指令:

Android中寄存器 寄存器ax_寄存器_03

这里需要注意的是,汇编的指令需要从后往前看,例如mov ax,18正确的顺序是将18送入ax中。

 两道例题:

(1)

mov ax,8226H

mov bx,8226H

add ax,bx

结果ax中存放的数是044CH

因为即使8226H+8226H=1044CH但是ax为16位寄存器,只能存放044CH,多出的1这里不做讲解。以后的博客中会说。

(2)

mov al,00C5H

add al,93H

那么结果al中存放的数据不是0158H而是0058H,因为这里用的是al寄存器,ax的低8位寄存器,所以高8位为0,至于多出的那个1这里先不做讲解。以后的博客中会说。

 

8086CPU给出物理地址的方法:

将16位的段地址和16位的偏移地址通过地址加法器给出20位的物理地址。

Android中寄存器 寄存器ax_段地址_04

 

3.地址加法器合成物理地址的方法

物理地址=段地址*16=偏移地址

Android中寄存器 寄存器ax_寄存器_05

 

 段地址*16就是向左移一位,如果是二进制数则就是向左移四位

虽然“段地址”这个名词中包含了“段”这个字,但是并不是说将内存分为一个个的段。

两点需要注意:

(1)段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;

(2)偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。

 

Android中寄存器 寄存器ax_寄存器_06

从这个图中可以得出结论:CPU可以通过不同的段地址和偏移地址形成同一个物理地址。

 

4.段寄存器

段寄存器顾名思义就是提供段地址的寄存器,8086CPU有4个段寄存器,分别是CS、DS、SS、ES。

CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。

CS为代码段寄存器,IP为指令指针寄存器(偏移地址寄存器)

Android中寄存器 寄存器ax_寄存器_07

当8086CPU启动时或者复位时,CS=FFFFH,IP=0000H

传送指令mov不能修改CS和IP寄存器里的值,但是8086CPU提供的一个转移指令jmp指令来修改CS与IP寄存器的值。

 

5.DEBUG中常用指令

R命令查看、改变CPU寄存器的内容;

D命令查看内存中的内容;

E命令改写内存中的内容;

U命令将内存中的机器指令翻译成汇编指令;

T命令执行一条机器指令;

A命令以汇编指令的格式在内存中写入一条机器指令;