16位汇编第二讲----8086的寄存器(2016.12.01)
来源:互联网 发布:知敬畏明底线心得体会 编辑:程序博客网 时间:2024/04/30 02:23
0x00 8086的内部结构图
8086的内部机构图很重要
0x01 8086寄存器组介绍
8086寄存器总共有14个寄存器,总体如下:
- 8个通用寄存器
- 1个指令指针寄存器
- 1个标志寄存器
- 4个段寄存器
0x02 8086通用寄存器介绍
8086的16位通用寄存器有分为数据寄存器、变址寄存器、指针寄存器。
- 数据寄存器
作用:数据寄存器用来存放计算的结果和操作数,也可以用存放地址。
AX – 累加器,使用频度最高,用于算术、逻辑运算以及与外设传送信息等;
BX – 基址寄存器,常用做存放存储器地址;
CX--计数器,作为循环和串操作等指令中的隐含计数器;
DX--数据寄存器,常用来存放双字长数据的高16位,或存放外设端口地址。
- 变址寄存器
作用:变址寄存器常用于存储器寻址时提供地址,串操作类指令中,SI和DI具有特别的功能。
SI是源变址寄存器(Source)
DI是目的变址寄存器(Destination)
- 指针寄存器
作用:指针寄存器用于寻址内存堆栈内的数据
SP-堆栈指针寄存器,指示栈顶的偏移地址,SP不能再用于其他目的,具有专用目的。
BP-为基址指针寄存器,表示数据在堆栈段中的基地址。
SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的存储单元地址
0x03 8086指令指针IP
作用:指示代码段中指令的偏移地址,它与代码段寄存器CS联用,确定下一条指令的物理地址。
注意:IP寄存器不能够直接辅助改变
0x04 标志寄存器
作用: 标志(Flag)用于反映指令执行结果或控制指令执行形式,8086处理器的各种标志形成了一个16位的标志寄存器FLAGS(程序状态字PSW寄存器)
描述:标志寄存器FLAGS只有9位可用,其中6位为状态标志,3位控制标志。
状态标志
作用:用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它。
CF ZF SF PF OF AF控制标志
作用:可由程序根据需要用指令设置,用于控制处理器执行指令的方式
DF IF TF
0x05 标志寄存器各位实验
- 首先先来介绍以下debug中各标志位的意义
OF(ov/nv):Over 溢出 标志位 溢出 OV(overflow溢出) NV(no overflow未溢出)DF(dn/up):Direction 方向 标志位 方向 DN(Down减少) UP(UP增加)IF(ei/di):Enable 允许中断 标志位 中断 EI(enable interrupt许可) DI(disable interrupt 禁止)SF(ng/pl):Symbol 符号 标志位 符号位 NG(negative)负 PL(plus 正)ZF(zr/nz):Zero 零 标志位 零位 ZF(zero等于零) NZ(no zero不等于零)AF(ac/na):Auxiliary 辅助进位 标志位 辅助进位 AC(assistant carry进位) NA(no assistant carry 无进位)PF(pe/po):Parity 奇偶 标志位 奇偶标志 PE(parity even偶) PO(parity odd奇)CF(cy/nc):Carry 进位 标志位 进位 CY(carry Yes进位) NC(No carry无进位)TF ( Trap Flag ) 追踪标志: 当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
- 进位标志CF(Carry Flag)
作用:当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF = 1;否则CF = 0。
Debug中进行实验,计算FF00+4400的和,注意这里的两个数都是无符号数:
可以看到Debug中最后一位由NC变为了CY,表示了计算结果进位。
- 零标志ZF(Zero Flag)
作用:若运算结果为0,则ZF = 1;否则ZF = 0
Debug中进行实验,计算AX寄存器自身减去自身的结果
可以看到Debug中的ZF标志位由NC变为ZR,表示指令计算结果为0.
- 符号标志SF(Sign Flag)
作用:运算结果二进制最高位为1,则SF = 1;否则SF = 0.
Debug中进行实验,计算4000+4000的结果
由于计算结果为8000,二进制最高位为1,则SF标志位由PL变为NG
- 奇偶标志PF(Parity Flag)
作用:当运算结果最低字节中“1”的个数为零或偶数时,PF = 1;否则PF = 0
Debug中进行实验,计算3A+7A的值。
由于3AH+7AH=B4H=10110100B,二进制中总共有4个1,所以为偶数个1,奇偶标志位PF由PO变为PE
- 溢出标志OF(Overflow Flag)
作用:若算术运算的结果有溢出,则OF=1;否则 OF=0
Debug中进行实验,计算4000+4000的值,注意这里的两个4000表示有符号数。
由于计算结果最高位为1,计算结果为负数明显是错误的结果,产生溢出,OF标志位由NV变为OV
- 辅助进位标志AF(Auxiliary Carry Flag)
作用:运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。
Debug中进行实验,计算3A+7C的值
由于低半字节存在进位,所以AF标志位由NA变为了AC
- 方向标志DF(Direction Flag)
作用:用于串操作指令中,控制地址的变化方向
设置DF=0,存储器地址自动增加;
设置DF=1,存储器地址自动减少。
Debug中进行实验,输入指令CLD(复位指令),输入STD(置位指令)
可以观察出CLD将DF标志位置为UP,而STD将DF标志位置为DN。
- 中断允许标志IF(Interrupt-enable Flag)
作用:用于控制外部可屏蔽中断是否可以被处理器响应:
设置IF=1,则允许中断;
设置IF=0,则禁止中断。
Debug中进行实验,输入指令CLI(中断复位指令),输入STI(中断置位指令)
可以观察出CLI将IF标志位置为DI,而STI将ID标志位置为EI。
- 陷阱标志TF(Trap Flag)
作用:用于控制处理器进入单步操作方式:
设置TF=0,处理器正常工作;
设置TF=1,处理器单步执行指令。
由于Debug中没有这一位,所以我们在OD中进行实验:在OD中随便拖入一个程序修改汇编代码然后单步执行,
输入以下汇编代码
PUSHF POP AXOR AX, 0100HPUSH AXPOPF
单步执行以上代码,尽可以看到TF的值被置为了1.
0x06 进位和溢出的区别
进位和溢出是两个比较容易混淆得概念
这里做出解释:
溢出标志OF和进位标志CF是两个意义不同的标志
- 进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;
- 溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。
注意:计算机只会不会区别一个数是否是有符号数还是无符号数,这是由程序员来决定的
例子:
例1:3AH + 7CH=B6H
无符号数运算: 58+124=182
范围内,无进位
有符号数运算: 58+124=182
范围外,有溢出
例2:AAH + 7CH=(1)26H
无符号数运算: 170+124=294
范围外,有进位
有符号数运算: -86+124=28
范围内,无溢出
如何运用溢出和进位
处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF。
应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。
- 16位汇编第二讲----8086的寄存器(2016.12.01)
- 16位汇编第六讲汇编指令详解第二讲
- 16位汇编 寄存器的操作
- 16位汇编第五讲----8086指令集(1)
- 16位汇编第六讲----8086指令集(2)
- 16位汇编第七讲----8086指令集(3)
- 16位汇编第八讲----8086指令集(4)
- 8086汇编学习之标志位寄存器的应用
- 汇编第二节-寄存器
- (32位汇编 八)标志寄存器
- 寄存器讲解--汇编(32位处理器)
- 32位汇编寄存器
- 32位汇编寄存器
- 16位汇编第四讲----8086寻找方式
- 16位汇编第一讲----Debug的使用以及Hello World(2016.11.29)
- 16位汇编第八讲----8086指令集(5)【控制转移类指令】
- 16位汇编第十讲----8086指令集(6)【子程序与中断】
- (32位汇编 四)32位通用寄存器
- 图片上传
- T语言与快速开发平台之天宇联ui设计规范
- 模拟内存分配
- 电商项目与大数据应用
- jieba中文分词的.NET版本:jieba.NET
- 16位汇编第二讲----8086的寄存器(2016.12.01)
- Too many open files
- 《Windows核心编程》笔记-虚拟内存、内存
- TR069协议详解
- Core Data的理解
- centos安装教程
- 使用mybatis-generator添加自定义分页插件时提示无法实例化插件类
- Struts2
- 数据库知识点总结