8086寄存器学习

参考资料: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:    溢出标志,其通常记录了有符号数运算的结果是否发生了溢出 。

 

转载于:https://www.cnblogs.com/otaganyuki/p/8196323.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值