8086有14个寄存器:AX,BX,CX,DX,SP,BP,SI,DI,DS,ES,SS,CS,IP,flags。
// 以下为这14个寄存器的速查表。要记清楚每个寄存器的详细用法,还是多写代码,汇编:王爽-汇编
如图:在debug下用r命令查看各个寄存器Register:
已知,8086CPU分为两部分:总线接口单元BIU和执行单元EU。
见:8086CPU内部结构
为方便记忆,这14个寄存器分组记忆。
BIU:总线接口单元,完成CPU<-->存储器/IO设备之间的数据传送。
EU:执行单元,执行指令。
下面是各个寄存器的英文全称和意义:
接下来是各个寄存器的具体介绍(顺序:ABCD_X, SB_P, SD_I, DESC_S, IP, flags。就这样速记吧)
1. 4个数据寄存器(X结尾表示通配H和L,比如说AX作为一个16位寄存器,可以拆分为高8位的AH和低8位的AL使用)
AX(Accumlator X),作为一个累加器,普通操作:存放加数。(或别的数据)
BX(Based X),基本的。
CX(Counter X),计数器,CX可以做一件别的寄存器都做不了的事:在loop循环中存放循环次数,每次递减。
DX(Data X),存放数据。
以下为更详细的介绍:
2. 两个指针寄存器&2个变址寄存器
SP(Stack Pointer):栈顶指针。用于保存栈顶元素所在的偏移地址EA(Effective Address,有效地址|偏移地址)。
栈顶两个内存单元格的物理地址,我们用逻辑地址表示,形式:SA:EA,即“段地址:逻辑地址”的形式。段地址放在SS(Stack Segment)栈段寄存器中,这是基础。随着元素的入栈出栈操作,栈顶位置在变化,所以需要一根针,指向这个位置。SP就是这根针。我们的入栈出栈操作都是要先通过SP找到栈顶位置,才能进行后续操作。
BP,也是一根针。Pointer。
SI和DI(xx Index),这两个变址寄存器,也是保存偏移地址,用作寻址。
3. 4个段寄存器和两个控制寄存器
DS, ES, SS正如其名,分别存放数据段,额外(附加数据)段,栈段的段地址。当然,谁作为偏移地址与之相配合,也是有固定的规则:
CS:IP
计算机要工作,只会按照既定的轨迹|流程|指令去操作,而要执行的指令时不断在变化,这些指令的地址|存放位置在哪里?
CS存放代码所在的段,IP是一个Pointer,可以指向不同的位置。(范围不会太大,64KB)。
flags,就是一些flag|标志位的集合。
在程序的流程控制中有很多判断,而在底层的实现是没有if..else什么的。解决方式就是:我们的运算或其他操作会影响标志位的状态1或0,而之后的程序 执行路径|流程 会由这些flags的标志位影响。
flags也是一个16位寄存器,而其中只有9位是有用的。有标志位。每个位通过他的值1或0来表示一个标志是否成立。
比如说ZF(Zero Flag)。
执行下面的汇编代码(含伪码)。执行完sub ax, 4之后,结果为0,那么就会将flags中的ZF状态位置1,表示刚才的操作结果为0。而后面的判断,会根据flags中相应位的值,取决定接下来的程序流程。
mov ax, 4
sub ax, 4
如果 (结果==0) 情况1;
否则 情况2;
详见下一篇 8086的flags