《汇编语言》第十一章-标志寄存器

目录:https://blog.csdn.net/qq_43098197/article/details/124532401

标志寄存器

CPU 内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下三种功能:

  1. 用来存储相关指令的某些执行结果。
  2. 用来为 CPU 执行相关指令提供行为依据。
  3. 用来控制 CPU 的相关工作方式。

8086CPU 的标志寄存器有 16 位,其中存储的信息通常被称为程序状态字(PSW)。

标志寄存器不同于其它寄存器有自己的整体含义,标志寄存器是按位来定义含义,即不同的位有不同的作用(含义)。

在这里插入图片描述

ZF 标志

  • 位置:第 6 位。
  • 零标志位:记录相关指令执行后,其结果是否为 0。若非 0 ,则 ZF 为 0,否则 ZF 为 1。

PF 标志

  • 位置:第 2 位。
  • 奇偶标志位:记录相关指令执行后,其结果的 bit 位中 1 的个数是否为偶数。若是,则 PF = 1,否则 PF = 0。

SF 标志

  • 位置:第 7 位。
  • 符号标志位:记录相关指令执行后,其结果是否为负数。若为负数,则 SF = 1,否则 SF = 0。

CF 标志

  • 位置:第 0 位。
  • 进位标志位:一般情况下,在进行无符号数运算时,它记录了运算结果的最高有效位向更高位的进位值,或从更高位借位。

OF 标志

  • 位置:?

  • 溢出标志位:在进行有符号数运算时,若结果超过了机器所能表示的范围称为溢出。

    机器所能表示的范围:1 byte 数据范围 -128~127,2 byte 数据范围 -23768~32767。

CPU 在执行 add 等指令的时候,就包含了两种含义:无符号运算和有符号运算。

  • 对于无符号,CPU 用 CF 位来记录是否产生了进位。
  • 对于有符号,CPU 用 OF 位来记录是否产生了溢出。

adc 指令

  • 带进位加法指令。

  • 它利用了 CF 位上记录的进位值实现进位。

  • 格式:adc 操作对象 1, 操作对象 2

  • 功能:

    adc ax, bx ; (ax)=(ax)+(bx)+CF
    

sbb 指令

  • 带借位减法指令。

  • 它利用了 CF 位上记录的借位值实现借位。

  • 格式:sbb 操作对象 1, 操作对象 2

  • 功能:

    sbb ax, bx ; (ax)=(ax)-(bx)-CF
    

cmp 指令

  • 比较指令。
  • 效果和 sub 减法指令一样,只是操作过后的结果并不会记录下来,而会去改变标志寄存器中相应的标志位。
  • 格式:sbb 操作对象 1, 操作对象 2
  • 功能:对两个操作数进行比较。

cmp 指令在执行时,有两种含义:无符号数比较、有符号数比较

  • 无符号数比较:

    ZF = 1 			 ; (ax) = (bx)
    ZF = 0 			 ; (ax) != (bx)
    CF = 1 			 ; (ax) < (bx)
    CF = 0 			 ; (ax) >= (bx)
    CF = 0 且 ZF = 0 ; (ax) > (bx)
    CF = 1 或 ZF = 1 ; (ax) <= (bx)
    
  • 有符号数比较:

    ZF = 1 且 OF = 0 ; (ah) < (bh)
    SF = 1 且 OF = 1 ; (ah) > (bh)
    SF = 0 且 OF = 1 ; (ah) < (bh)
    SF = 0 且 OF = 0 ; (ah) >= (bh)
    

检测比较结果的条件转移指令

jcxz 就是条件转移指令,根据检测 CX 中的数值,决定是否跳转。

常用的根据无符号数的比较结果进行转移的条件转移指令:

指令转移条件检测的相关标志位
je = = =ZF = 1
jne ≠ \neq =ZF = 0
jb < \lt <CF = 1
jnb ≥ \ge CF = 0
ja > \gt >CF = 0 且 ZF = 0
jna ≤ \le CF = 1 或 ZF = 1

通常配合 cmp 指令使用,实现 if 的效果。

DF 标志和传送指令

  • 位置:第 10 位。

  • 方向标志位:在串处理指令中,控制每次操作后 si、di 的增减。
    DF = 0,每次操作后 si、di 递增
    DF = 1,每次操作后 si、di 递减

movsb

  • 格式:movsb
  • 功能:将 ds:si 地址中的值(字节单位)赋值给 es:di 地址中,然后根据 DF 标志位进行 si、di 增减 1 的操作。

movsw

  • 格式:movsw
  • 功能:将 ds:si 地址中的值(字单位)赋值给 es:di 地址中,然后根据 DF 标志位进行 si、di 增减 2 的操作。

cld 与 std

  • cld 指令:将标志寄存器的 DF 位置为 0
  • std 指令:将标志寄存器的 DF 位置为 1

这两个指令相当于设置了数据的传输方向。
0 为正向(递增),1 为逆向(递减)。

通常配合 rep 使用

rep movsb
rep movsw

; 相当于
s: movsb
   loop s

s: movsw
   loop s

rep 的作用:根据 CX 的值,重复执行后面的串传送指令。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值