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。
    应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。

1 0