【新书推荐】6.4节 标志寄存器

本节内容:8086 CPU内的标志寄存器FLAG为16位寄存器。本节我们将讲述FLAG寄存器各个标志位的使用方法。

标志寄存器的标志位:标志位可以分为6个状态标志位和3个控制标志位,此外还有7个保留的标志位。状态标志位用来记录算术逻辑运算的结果。控制标志位用来控制计算机的运行。

标志位的分类:6个状态标志位分别为CF、PF、AF、ZF、SF、OF标志位。3个控制标志位分别为DF、IF、TF标志位。初始状态IF中断标志置1,表示开中断,其余标志位均清零。

6.4.1 标志寄存器的标志位

表6-9列出了8086 CPU内的FLAG标志寄存器的所有标志位。FLAG共有16个标志位,其中包含6个状态标志位、3个控制标志位,第1位、第3位、第5位和第12位至第15位未使用。状态标志位用于记录算术逻辑运算的结果。控制标志位用于控制其计算机的运行。

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

OF

DF

IF

TF

SF

ZF

AF

PF

CF

6-9 FLAG寄存器的标志位

我们在第五章16位汇编学习环境中学习了Debug调试器内的使用方法。Debug调试器的“r”命令可以显示8086CPU所有寄存器的值,其中FLAG寄存器以标志位的形式显示,如图6-15所示。

图6-15 Debug调试器显示寄存器的值

提示

         Debug调试器中,缺省了TF标志位的显示。TF标志位默认置0,Debug调试器单步执行时,TF位置1。

         Debug调试器中,FLAG寄存器的标志位使用字母符号表示当前标志位置0或者置1。字母符号含义可以参考表6-1。

6.4.2 标志位的分类

8086CPU的FLAG标志寄存器的标志位可以分为状态标志位和控制标志位两类。下面我们来看这两类标志位的具体含义。

状态标志位

    ●进位标志CF

CF标志位用于记录无符号整数算术逻辑运算是否产生进位或借位。如果运算结果的最高位(字操作时的第15位或字节操作时的第7位)产生一个进位或借位,则CF置1,否则CF清零。在进行多字节加减运算时,要使用到该标志;比较无符号数的大小时,也要使用到该标志。

动手实验11:测试CF标志位

如图6-16所示,在Debug调试器中输入命令a,输入下面两条语句,并单步执行,注意观察CF位的变化。

mov al,98h

add al,al   ;结果al+al结果保存在al中,al=30H,产生进位1丢弃,CF位置1。

图6-16 测试CF标志位

●零标志ZF

零标志位用于记录算术逻辑运算结果是否为0。如果运算结果为0,ZF置1,否则ZF被清零。常用于判断两个操作数是否相等,或者运算结果是否为0。

动手实验12:测试ZF标志位

如图6-17所示,在Debug调试器中输入命令a,输入下面两条语句,并单步执行,注意观察ZF位的变化。

mov ax,1   

sub ax,1    ; 结果ax-1=0,ZF位置1

图6-17 测试ZF标志位

●符号标志SF

符号标志位SF用于记录算术逻辑运算结果的符号位。SF与运算结果的最高位相同,如果运算结果的最高位为1,则SF被置1,否则SF清零。由于在8086/8088系统中,有符号数采用补码的形式表示,所以SF反映了运算结果的符号。如果运算结果为正数,则SF被清零;如果运算结果为负数,否则SF被置1。

动手实验13:测试SF标志位

如图6-18所示,在Debug调试器中输入命令a,输入下面两条语句,并单步执行,注意观察SF位的变化。

mov al,10000001B;16进制数81H  

add al,1        ;结果al+1=82H,最高位为1,SF位置1

图6-18 测试SF标志位

●溢出标志OF

溢出标志OF用于记录有符号算术逻辑运算是否引起溢出。如果运算结果超过了8位或16位有符号数的表示范围,即在字节运算时大于127或小于-128,在字运算时大于32767或小于-32768时,称为溢出。如果溢出,则OF被置1,否则OF被清零。通常用于判断有符号数运算结果的正确性。即如果有符号整数运算结果不合理,则OF位置1,否则OF位清零。

正数+正数=负数,不合理,OF位置1;

负数+负数=正数,不合理,OF位置1;

动手实验14:测试OF标志位

如图6-19所示,在Debug调试器中输入命令a,输入下面两条语句,并单步执行,注意观察OF位和CF位。

mov al,98H

add al,99H  ;结果al=98H+99H=31H,最高位1溢出,OF位置1,CF位也置1

图6-19 测试OF标志位

思考

         为何CF位和OF位会同时被置1?请举例说明。

谨慎

要特别注意,CF位和OF位是两个不同性质的标志,不能混淆。

进位标志CF位用于记录无符号整数算术逻辑运算结果;

溢出标志OF位用于记录有符号整数的算术逻辑运算结果;

●奇偶标志PF

奇偶标志PF用于反映运算结果中“1”的个数。如果“1”的个数为偶数,则PF被置1,否则PF被清零。利用PF可以进行奇偶校验检查,或产生奇偶校验位。在串行通信中,为了提高传送的可靠性,常采用奇偶校验。

动手实验15:测试PF标志位

如图6-20所示,在Debug调试器中输入命令a,输入下面两条语句,并单步执行,注意观察PF位的变化。

mov al,1    

add al,10h  ;al=1+10h=11h,PF为置1

图6-20 测试PF标志位

注意

奇偶标志判断的是运算结果中 “1”的个数,而不是对奇数或者偶数的判断。

●辅助进位标志AF

在字节操作时,如果发生低半字节向高半字节进位或借位;在字操作时,如发生低字节向高字节进位或借位,则辅助进位标志AF被置1,否则AF被清零。十进制算术运算调整指令自动根据该标志产生相应的调整动作。我们将在第十八章十进制算术调整指令学习十进制算术调整指令。

动手实验16:测试AF标志位

如图6-21所示,在Debug调试器中输入命令a,输入下面三条语句,并单步执行,注意观察AF位的变化。

    mov al,34h

    add al,47h  ;34h+47h=7Bh

    daa         ;将7Bh调整为十进制数BCD码81h,AF位置1

图6-21 测试AF标志位

我们将在第十八章十进制算术调整指令中详细讲解AF位的使用。

■控制标志位

●方向标志DF

方向标志DF决定字符串操作指令执行时有关指针寄存器调整方向。当DF=1时,字符串操作按减方式改变有关存储器指针值;当DF=0时,串操作按加方式改变有关存储器指针值。8086/8088提供专门用于设置方向标志DF的指令是STD,专门用于清DF的指令CLD。

举例

1.源地址DS:[SI]指向源字符串“0123456789”中的字符’0’。

将源地址处的字符串正序复制到目的地址ES:[DI]处。

cld     ;DF位清零

MOVSB   ;以字节为单位,循环复制10次

复制后,目的地址ES:[DI]处保存的字符串为“0123456789”。

2.源地址DS:[SI]指向源字符串“0123456789”中的字符’9’。

将源地址处的字符串倒序复制到目的地址ES:[DI]处。

std     ;DF位置1

MOVSB   ;以字节为单位,循环复制10次

复制后,目的地址ES:[DI]处保存的字符串为“9876543210”。

●中断允许标志IF

中断允许标志决定CPU是否响应外部可屏蔽中断请求。

当IF置1时,CPU能够响应外部的可屏蔽中断请求,例如响应键盘、打印机中断请求;

当IF置0时,则不响应外部可屏蔽中断请求,此时按下键盘按键时不会得到响应。但此标志的状态对于外部非屏蔽中断请求,或内部产生的中断不起作用。我们将在第十六章输入和输出中断中详细学习中断请求。

8086/8088提供的专门用于设置中断允许标志IF的指令是STI,专门用于清IF的指令是CLI。

cli     ;IF位清零

sti     ;IF位置1

●单步追踪标志TF

当单步追踪标志TF被置1后,CPU进入单步方式。所谓单步方式指在一条指令执行后,产生一个单步中断,这主要用于程序的调试。8086CPU没有专门设置和清除TF标志的指令,要通过其他方法设置或清除TF。我们将在第八章8086指令系统学习设置或清除TF位的方法。

练习

1、请写出下面每条指令执行后,ZF、PF、SF等标志位的值。

sub bl,bl              ZF=  ?   PF=?      SF=?

mov al,2              ZF=  ?   PF=?      SF=?

push ax               ZF=  ?   PF=?      SF=?

pop bx              ZF=  ?   PF=?      SF=?

add al,ah             ZF=  ?   PF=?      SF=?

add al,8                 ZF=  ?   PF=?      SF=?

mul bl              ZF=  ?   PF=?      SF=?

2、请写出下面每条指令执行后,ZF、PF、SF、CF、OF等标志位的值。

                CF     OF    SF     ZF     PF

sub al,al            0      0      0      1      1

mov al,12h            ?

add al,99h            ?

mov al,81h          ?

add al,80h                  ?

mov al,0ffh                ?

add al,05h                  ?

mov al,7fh                  ?

add al,1bh                  ?

3、请说明CF标志位和OF标志位的区别。

4、8086标志寄存器中定义了哪些标志?这些标志可分为哪两类?如何改变这些标志的状态?

5、请写出如下程序片段中每条算术运算指令执行后标志CF、ZF、SF、OF、PF、AF的状态。

mov al,89h

add al,al

add al,9dh

cmp al,0bch

sub al,al

dec al

inc al

自己动手网上查资料,或者利用debug工具得出结果;

6、请写出如下程序片段中每条逻辑运算指令执行后标志ZF、SF、PF的状态:

mov al,45h

and al,0fh

or al,0c3h

xor al,al

7、请写出如下程序片段中每条移位指令执行后标志CF、ZF、SF、PF的状态:

mov al,86h

sar al,1

shr al,1

ror al,1

rcl al,1

shl al,1

rol al,1

本文摘自编程达人系列教材《X86汇编语言基础教程》。资料下载www.bcdaren.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/458554.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# CAD交互界面-自定义面板集(四)

运行环境 vs2022 c# cad2016 调试成功 一、引用 using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows; using System.Windows.Forms; 二、程序说明 创建自定义面板集(PaletteSet)的C#命令方法实现。该方法名为CreatePalette&#xff…

Nacos(2)

Nacos部署 服务器端docker部署(需要服务器安装好docker) 导入sql文件到服务器编写nacos配置文件custom.env(示例如下,改为自己服务器nacos相关信息) PREFER_HOST_MODEhostname MODEstandalone SPRING_DATASOURCE_PL…

Git介绍和常用命令说明

目录 一、Git概述 1.1 Git是什么 1.2 Git有什么用 1.3 Git仓库介绍 二、Git下载与安装 三、Git代码托管服务(远程仓库) 四、Git常用命令 4.1 设置用户信息 4.2 获取Git仓库 4.2.1 本地初始化Git仓库 4.2.2 从远程仓库克隆 4.3 本地仓库操作 …

CentOS7如何安装宝塔面板并实现固定公网地址远程访问

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔,内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具,适合新手,简单好用。当我们在家里/公司搭建了宝塔,没有公网IP,但是想要在外也可以访问内…

电力负荷预测 | 基于AE-LSTM的电力负荷预测(Python)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力负荷预测 | 基于AE-LSTM的电力负荷预测(Python) 基于AE-LSTM(自动编码器长短期记忆网络)的电力负荷预测是一种基于深度学习的方法,用于预测未来一段时间内的电力负荷需求。该方法结合了自动编码器和LSTM网…

minio集群搭建(纠删码模式)

搭一个4个节点,16块硬盘的minio集群。 1.先做一些准备工作,新建了4个centos7的虚拟机,各新添加4块硬盘 我用的虚拟机软件是VirtualBox, 先搭建4个虚拟机,即4个节点, 建虚拟机就不讲了 用VirtualBox添加硬盘…

版本控制器Git

目录 背景 图形化界面 下载安装或使用网页版 安装图形化界面 注册账号 创建仓库​ 创建本地仓库 ​创建项目到本地工作目录 三板斧 git add git commit git push 注意 命令行 Git和Gitee/Github的区别? 版本控制器是什么? 本地仓库VS…

人工智能对人类就业造成的“爆炸性”影响

原创 | 文 BFT机器人 人工智能( AI )将深刻改变全球经济 , 一些评论家认为它类似于新的工业革命。它对经济和社会的影响仍然难以预测。这在劳动力市场的背景下尤其明显,在劳动力市场中,人工智能有望提高生产率&#x…

【flink状态管理(2)各状态初始化入口】状态初始化流程详解与源码剖析

文章目录 1. 状态初始化总流程梳理2.创建StreamOperatorStateContext3. StateInitializationContext的接口设计。4. 状态初始化举例:UDF状态初始化 在TaskManager中启动Task线程后,会调用StreamTask.invoke()方法触发当前Task中算子的执行,在…

CSS的动画

CSS的动画 在本节,我们将学习keyframes动画。 1. 动画的基本使用 1. 定义动画 定义动画有两种写法: 简单定义方式 keyframes 动画名 {/* from代表初始状态 */from {/*property1:value1*/transform: translate(0%);}/* to代表结束状态 */to {transfor…

c#cad 创建-正方形(四)

运行环境 vs2022 c# cad2016 调试成功 一、程序说明 创建一个正方形,并将其添加到当前活动文档的模型空间中。 程序首先获取当前活动文档和数据库,并创建一个编辑器对象。 然后,使用事务开始创建正方形的操作。获取模型空间的块表记录&a…

【机器学习】单变量线性回归

文章目录 线性回归模型(linear regression model)损失/代价函数(cost function)——均方误差(mean squared error)梯度下降算法(gradient descent algorithm)参数(parame…