8086寄存器学习

参考资料:https://www.cnblogs.com/BoyXiao/archive/2010/11/20/1882716.html

 

8086  CPU 中寄存器总共为 14 个,且均为 16

 AXBXCXDXSPBPSIDIIPFLAGCSDSSSES  14 个。

而这 14 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。

通用寄存器:

AXBXCXDX 称作为数据寄存器:

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不仅有上面所说的那些作用,还可以用作暂存数据和传送数据

为了兼容8cpu 以上四个寄存器可以被拆分为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

https://images2017.cnblogs.com/blog/1104670/201801/1104670-20180104220550549-1323591115.png

 

以下为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

https://images2017.cnblogs.com/blog/1104670/201801/1104670-20180104221744893-400100294.png

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 个寄存器可以以  […]  的方式使用,这四个寄存器分别是 BXSIDIBP

 

SI DI变址寄存器 主要用于偏移地址  段地址不填默认为DS  听说si di能自增,我是没找到怎么用,求指教

剩下四个段寄存器和两个控制寄存器及SP

稍微说下cs ip,因为这个之前或多或少都接触过,稍微提一下就行了。我们知道程序编译后是由一条条指令构成的,

cpu执行指令就是执行程序编译后的指令。cs ip两个寄存器就是指示cpu下一条要执行的指令的地址。

 

看到一段关于cs ip的话:

当我们运行一个可执行文件时,很明显,我们需要另外一个程序来将这个可执行文件加载到内存当中,

一般是通过操作系统的外壳程序(也就是传说中的  Shell  程序),???????????

Shell  将可执行文件加载到内存中以后,就会设置  CPU  中的两个寄存器,

即设置  CS:IP  两个寄存器指向可执行文件的起始地址,此后  CPU  便从这个起始地址开始读取内存中的指令,并且执行,

SSSP寄存器,指向栈顶

 

ES附加段寄存器,顾名思义就是个附加的段寄存器

 

FLAG寄存器

https://images2017.cnblogs.com/blog/1104670/201801/1104670-20180105204951737-1180682251.png

 

 https://images2017.cnblogs.com/blog/1104670/201801/1104670-20180105205436534-1440098109.png

CFCarry  FLag - 进位标志(第 0 位):

CF    进位标志是用来反映计算时是否产生了由低位向高位的进位,或者产生了从高位到低位的借位 。产生置1

PFParity  FLag - 奇偶标志(第 2 位):

PF    奇偶标志是用来记录相关指令执行后,其结果的所有的  Bit  位中  1  的个数是否为偶数 。是则置1

AFAuxiliary  Carry  FLag - 辅助进位标志(第 4 位):

AF    用来辅助进位标志

字节操作中发生低半个字节向高半个字节借位或者进位      字操作中发生低字节向高字节借位或者进位  时置1

ZFZero  FLag零标志(第 6 位):

ZF    记录的是相关的指令执行完毕后,其执行的结果是否为  0 。是则置1

SFSign  FLag - 符号标志(第 7 位):

SF    符号标志,其记录相关指令执行完以后,其结果是否为负数 。是则置1

TFTrap  FLag - 追踪标志(第 8 位):

TF    追踪标志,主要是用于调试时使用 。当追踪标志TF被置为1时,CPU进入单步执行方式。

IFInterrupt-Enable  FLag - 中断允许标志(第 9 位):

IF    中断允许标志,其决定  CPU  是否能够响应外部可屏蔽中断请求

DFDirection  FLag - 方向标志(第 10 位):

DF    方向标志,其用于在串处理指令中,用来控制每次操作后  SI    DI  是自增还是自减

OFOverFlow  FLag - 溢出标志(第 11 位):

OF    溢出标志,其通常记录了有符号数运算的结果是否发生了溢出

 

猜你喜欢

转载自blog.csdn.net/sinat_30457013/article/details/89381530