参考资料:https://www.cnblogs.com/BoyXiao/archive/2010/11/20/1882716.html
8086 CPU 中寄存器总共为 14 个,且均为 16 位 。
即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 共 14 个。
而这 14 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。
通用寄存器:
AX,BX,CX,DX 称作为数据寄存器:
AX (Accumulator):累加寄存器,也称之为累加器;
BX (Base):基地址寄存器;
CX (Count):计数器寄存器;
DX (Data):数据寄存器;
SP 和 BP 又称作为指针寄存器:
SP (Stack Pointer):堆栈指针寄存器;
BP (Base Pointer):基指针寄存器;
SI 和 DI 又称作为变址寄存器:
SI (Source Index):源变址寄存器;
DI (Destination Index):目的变址寄存器;
控制寄存器:
IP (Instruction Pointer):指令指针寄存器;
FLAG:标志寄存器;
段寄存器:
CS (Code Segment):代码段寄存器;
DS (Data Segment):数据段寄存器;
SS (Stack Segment):堆栈段寄存器;
ES (Extra Segment):附加段寄存器;
先来介绍通用寄存器
通用寄存器ax bx cx dx不仅有上面所说的那些作用,还可以用作暂存数据和传送数据
为了兼容8位cpu 以上四个寄存器可以被拆分为8个独立的8位寄存器使用 如ah al 除这四个寄存器其余均不可以不拆分
ax还有一些特殊作用
在除法运算div中 当除数为8位,ax默认存放被除数 计算出的商保存在al中,余数保存在ah中
当除数为16位时,ax默认存放被除数低16位,dx默认存放被除数高16位,计算出的商保存在ax中,余数保存在dx中
在乘法运算mul中,有8位乘8位和16位乘16位
8位乘8位中一个乘数保存在al中 ,另一个保存在其他寄存器或内存单元中 。计算结果保存在ax中
16位乘16位中一个乘数保存在ax中,另一个保存在其他16位寄存器或内存单元中。计算结果低位在ax中,高位在dx中
以下为8位除法测试
code segment
assume cs:code
start: mov bx,0fh
mov ax,21h
div bl
exit: mov ah,4ch
int 21h
code ends
end start
以下为16位乘法测试
code segment
assume cs:code
start: mov bx,100h
mov ax,100h
mul bx
exit: mov ah,4ch
int 21h
code ends
end start
bx主要用于偏移地址 直接[bx]等同于ds:[bx]
cx主要用于循环计数
CPU 在每一次执行 LOOP 指令的时候,都会做两件事:
一件就是令 CX = CX – 1,即令 CX 计数器自动减去 1;
还有一件就是判断 CX 中的值,如果 CX 中的值为 0 则会跳出循环,而继续执行循环下面的指令,
当然如果 CX 中的值不为 0 ,则会继续执行循环中所指定的指令 。注意是先减1再判断
DX之前说过了,和ax在乘除法中配合使用
BP主要用于方便的在堆栈中存取数据
[bp]可以直接存取ss:[bp],在 8086 CPU 中,只有 4 个寄存器可以以 […] 的方式使用,这四个寄存器分别是 BX,SI,DI,BP。
SI DI变址寄存器 主要用于偏移地址 段地址不填默认为DS 听说si di能自增,我是没找到怎么用,求指教
剩下四个段寄存器和两个控制寄存器及SP
稍微说下cs ip,因为这个之前或多或少都接触过,稍微提一下就行了。我们知道程序编译后是由一条条指令构成的,
cpu执行指令就是执行程序编译后的指令。cs ip两个寄存器就是指示cpu下一条要执行的指令的地址。
看到一段关于cs ip的话:
当我们运行一个可执行文件时,很明显,我们需要另外一个程序来将这个可执行文件加载到内存当中,
一般是通过操作系统的外壳程序(也就是传说中的 Shell 程序),???????????
Shell 将可执行文件加载到内存中以后,就会设置 CPU 中的两个寄存器,
即设置 CS:IP 两个寄存器指向可执行文件的起始地址,此后 CPU 便从这个起始地址开始读取内存中的指令,并且执行,
SS和SP寄存器,指向栈顶
ES附加段寄存器,顾名思义就是个附加的段寄存器
FLAG寄存器
CF(Carry FLag) - 进位标志(第 0 位):
CF: 进位标志是用来反映计算时是否产生了由低位向高位的进位,或者产生了从高位到低位的借位 。产生置1
PF(Parity FLag) - 奇偶标志(第 2 位):
PF: 奇偶标志是用来记录相关指令执行后,其结果的所有的 Bit 位中 1 的个数是否为偶数 。是则置1
AF(Auxiliary Carry FLag) - 辅助进位标志(第 4 位):
AF: 用来辅助进位标志 。
字节操作中发生低半个字节向高半个字节借位或者进位 字操作中发生低字节向高字节借位或者进位 时置1
ZF(Zero FLag) – 零标志(第 6 位):
ZF: 记录的是相关的指令执行完毕后,其执行的结果是否为 0 。是则置1
SF(Sign FLag) - 符号标志(第 7 位):
SF: 符号标志,其记录相关指令执行完以后,其结果是否为负数 。是则置1
TF(Trap FLag) - 追踪标志(第 8 位):
TF: 追踪标志,主要是用于调试时使用 。当追踪标志TF被置为1时,CPU进入单步执行方式。
IF(Interrupt-Enable FLag) - 中断允许标志(第 9 位):
IF: 中断允许标志,其决定 CPU 是否能够响应外部可屏蔽中断请求
DF(Direction FLag) - 方向标志(第 10 位):
DF: 方向标志,其用于在串处理指令中,用来控制每次操作后 SI 和 DI 是自增还是自减 。
OF(OverFlow FLag) - 溢出标志(第 11 位):
OF: 溢出标志,其通常记录了有符号数运算的结果是否发生了溢出 。