汇编语言:标志寄存器ZF、PF、SF、CF、OF、DF、IF、AF

news2025/1/11 19:43:40

        CPU内部的寄存器中,一种特殊的寄存器(对于不同的CPU,个数和结构可能都不同),具有以下3种作用。

(1)用来存储相关指令的某些执行结果

(2)用来为CPU执行相关指令提供行为依据

(3)用来控制CPU的相关工作方式

        这种特殊的寄存器在8086CPU中,被称为标志寄存器,8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(Program Status Word,PSW)。8086CPU的标志寄存器结构图如下:

其中,1、3、5、12、13、14、15位在8086CPU没有使用,不具有任何含义。

tips:

        在debug中,对标志位的表示按照显示顺序如下:

标志位值OFDFIFSFZFAFPFCF
0NVUPDIPLNZPONC
1OVDNEINGZRPECY

OF(Overflow Flag):溢出标志位,一般情况下,它记录了有符号运算的结果是否发生了溢出。

NV(No Overflow)= 0:没有溢出

OV(Overflow)= 1:溢出

DF(Direction Flag):方向标志位,在串行处理指令中,控制每次操作后si、di的增减。

df = UP = 0:每次操作后si、di递增,即:(si) = (si) + 1; (di) = (di) + 1;

df = DN(down)= 1:每次操作后si、di递减,即:(si) = (si) - 1; (di) = (di) - 1;

IF(Interrupt Flag):中断标志位。它用来控制8086是否允许接收外部中断请求。若IF=1,8086能响应外部中断,反之则屏蔽外部中断。
DI(Disabled Interrupt)= 0:不允许中断
EI (Enable Interrupt)= 1:允许中断

SF(Signed Flag):符号标志位,记录相关指令执行后,其结果是否为负,如果结果为负,则sf = 1,如果结果为非负,则sf = 0。

NG(Negative,负数)= 1:结果为负

PL(Plus,正数)= 0:结果为正

ZF(Zero Flag):零标志位,记录相关指令执行后,其结果是否为0,如果结果为0,则zf = 1,如果结果不为0,则zf = 0。

ZR(Zero)= 1:结果为0

NZ(Not Zero)= 0:结果不为0

AF(Auxiliary carray flag):辅助进位标志位,运算过程中看最后四位,不论长度为多少,最后四位向前有进位或者借位,AF = 1,否则AF = 0

AC(Auxiliary Carry)= 1:有辅助进位

NA(Not Auxiliary carry)= 0:没有辅助进位

PF(Parity Flag):奇偶标志位,记录相关指令执行后,其结果所有的位中 1 的个数是否为偶数,如果 1 的个数为偶数,则pf = 1,如果1的个数为奇数,则pf = 0。

PE(Parity Even,偶数)= 1:结果有偶数个1

PO(Parity Odd,奇数)= 0:结果有奇数个1

CF(Carry Flag):进位标志位,一般情况下,在进行无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从最高位借位值。

CY(Carried Yes)= 1:有进位

NC(Not Carried)= 0:没进位

1. ZF 标志(Zero Flag)

        标志寄存器的第6位是 zf,零标志位,记录相关指令执行后,其结果是否为0,如果结果为0,则zf = 1,如果结果不为0,则zf = 0。

比如

mov ax, 1

sub ax, 1

指令执行后,结果为0,则zf = 1。

mov ax, 2

sub ax, 1

指令执行后,结果不为0,则zf = 0

tips:

        在8086指令集中,有的指令的执行是影响标志寄存器的,比如:add,sub,mul,div,and,or,inc,dec等,它们大都是运算指令(进行算术运算或逻辑运算);有的指令的执行是不影响标志寄存器的,比如:mov,push,pop等,它们大都是传送指令。我们在使用一条指令的时候,要注意这条指令的全部功能,包括执行结果对标志寄存器的哪些标志位会产生影响。

2. PF 标志(Parity Flag)

        标志寄存器的第2位是 pf,奇偶标志位,记录相关指令执行后,其结果所有的位中 1 的个数是否为偶数,如果 1 的个数为偶数,则pf = 1,如果1的个数为奇数,则pf = 0。

比如

mov ax, 1

sub ax, 1

指令执行后,结果为0,所有的位中 1 的个数为 0 (偶数)个,则pf = 1。

mov ax, 2

sub ax, 1

指令执行后,结果为1,所有的位中 1 的个数为 1 (奇数)个,则pf = 0

3. SF 标志(Signed Flag)

        标志寄存器的第7位是 sf,符号标志位,记录相关指令执行后,其结果是否为负,如果结果为负,则sf = 1,如果结果为非负,则sf = 0。

        计算机中,通常用补码来表示有符号数,在计算机中,一个数可以看作是有符号数,也可以看成无符号数。

比如

0000 0001B,可以看成无符号数 1,也可以看成有符号数 +1

1000 0001B,可以看成无符号数 129,也可以看成有符号数 -127(原码:对补码再做一次求补码操作得到一个用补码形式表示的数的原码,补码 = 反码 + 1,补码:1000 0001B ,原码 = 反码 + 1 = 1111 1110B + 1 = 1111 1111b = -127)。

        所以,对于同一个二进制数,计算机可以将它当作无符号数据来运算,也可以当作有符号数据来运算。

比如

mov al, 10000001b

add al, 1

结果为:10000010b

        可以将 add 指令进行的运算当作无符号数的运算,那么 add 指令相当于计算 129 + 1,结果 = 130 (1000 0010b);也可以将 add 指令进行的运算当作有符号数的运算,那么 add 指令相当于计算 -127 + 1,结果 = -126(1000 0010b)

        所以,SF标志,就是CPU对有符号运算结果的一种记录,它记录了数据的正负。在我们数据当作有符号数来运算的时候,可以通过它来得到结果的正负;如果我们将数据当作无符号来运算,SF 的值则没有意义,虽然相关指令影响了它的值。也就是说,CPU 在进行 add 等指令时,是必然会影响到 SF 标志的值的。至于我们需不需要这种影响,那就看我们如何看待指令所进行的运算了。

比如

mov al, 10000001b

add al, 1

指令执行后,结果为:10000010b,sf = 1,表示:如果指令进行的是有符号数运算,那么结果为负,如果指令进行的是无符号数运算,虽然 sf = 1,但没有意义。

比如

mov al, 10000001b

add al, 01111111b

指令执行后,结果为:0,sf = 0,表示:如果指令进行的是有符号数运算,那么结果为非负。

        有些指令的执行会影响标志寄存器中的多个标记位,比如:sub al, al,执行后,标志寄存器中的 zf = 1,pf = 1,sf = 0

检测点11.1

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

sub al, al        ZF = 1, PF = 1, SF = 0

mov al, 1        ZF = 1, PF = 1, SF = 0(传送指令不影响标志寄存器的状态)

push ax          ZF = 1, PF = 1, SF = 0(传送指令不影响标志寄存器的状态)

pop bx           ZF = 1, PF = 1, SF = 0(传送指令不影响标志寄存器的状态)

add al, bl       ZF = 0, PF = 0, SF = 0(结果 = 0000 0010b,不为0,奇数个1,符号位为0)

add al, 10      ZF = 0, PF = 1, SF = 0(结果 = 0000 1100b,不为0,偶数个1,符号位为0)

mul al            ZF = 0, PF = 1, SF = 0 (结果 ax = 0000 0000 1001 0000b, 不为0, 偶数个1, 两个相同的数相乘结果肯定为正数,所以SF = 0)

在debug中,

4. CF 标志(Carry Flag)

        标志寄存器的第0位是 cf,进位标志位,一般情况下,在进行无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从最高位借位值。

        对于位数为N的无符号数来说,其对应的二进制信息的最高位,即第N-1位,就是它的最高位,而假想存在的第N位,就是相当于最高有效位的更高位,如下图所示。

        

我们知道,当两个数据相加时,有可能从最高有效位向更高位产生进位,8086CPU的标志寄存器的CF位就是来记录这个进位值的。

比如

mov al, 98h

add al, al        ;该指令执行后,(al) = 30h, CF = 1

add al, al        ;该指令执行后,(al) = 60h, CF = 0

而当两个数进行减法运算时,有可能向更高位借位,8086CPU的标志寄存器的CF位记录了这个借位值。

比如

mov al, 97h

sub al, 98h        ;该指令执行后,(al) = ffh, 向更高位借位了,CF = 1

sub al, al            ;该指令执行后,(al) = 0h, CF = 0

5. OF 标志(Overflow Flag)

        标志寄存器的第11位是 of,溢出标志位,一般情况下,它记录了有符号运算的结果是否发生了溢出。

        在进行有符号数运算时,如果超过了机器所能表示的范围称为溢出。比如,8位有符号数的范围:-128 ~ 127。16位有符号数的范围:-32768 ~ 32767。

示例:

8位有符号数

mov al, 100

add al, 29        ;该指令执行后,(al) = 01h,溢出了,OF = 1

示例:

8位有符号数

mov al, -100

sub al, 29        ;该指令执行后,(al) = 7fh,溢出了,OF = 1

tips:

-100 的补码:1001 1100b = 9ch

-29 的补码:1110 0011b = E3h

检测点11.2

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

sub al, al        ;ZF = 1,PF = 1,SF = 0,CF = 0,OF = 0(结果al = 0)

mov al, 10h    ;ZF = 1,PF = 1,SF = 0,CF = 0,OF = 0(传送指令,不影响标志寄存器的状态)

add al, 90h     ;ZF = 0,PF = 1,SF = 1,CF = 0,OF = 0(对于无符号数来说,0001 0000B + 1001 0000B = 1010 0000B,没有向更高位进位,所以 CF = 0,对于有符号数来说,0001 0000B + 1001 0000B = 1010 0000B = -96,实际上换成十进制是 16 + (-112) = - 96,没有溢出,所以 OF = 0,结果不为0,所以 ZF = 0,结果有2(偶数)个1,所以 PF = 1)

mov al, 80h     ;ZF = 0,PF = 1,SF = 1,CF = 0,OF = 0(传送指令,不影响标志寄存器的状态)

add al, 80h      ;ZF = 1,PF = 1,SF = 0,CF = 1,OF = 1(对于无符号来说,1000 0000B + 1000 0000B = 0000 0000B = 0,有向更高位进位,所以 CF = 1,对于有符号数,1000 0000B + 1000 0000B = 0000 0000B = 0,,实际上换成十进制是 -128 - 128 = -256,溢出了,所以,OF = 1,结果为0,所以 ZF = 1,结果有 0 (偶数)个1,所以 PF = 1,结果的符号位为0,所以 SF = 0)

mov al, 0FCh   ;ZF = 1,PF = 1,SF = 0,CF = 1,OF = 1(传送指令,不影响标志寄存器的状态)

add al, 05h       ;ZF = 0,PF = 0,SF = 0,CF = 1,OF = 0(对于无符号数来说,1111 1100B + 0000 0101B = 0000 0001B,有向更高位进位,所以 CF = 1,对于有符号数,1111 1100B + 0000 0101B = 10000 0001B = 0000 0001B = 1,实际上换成十进制是:-4 + 5 = 1,没有溢出,所以 OF = 0,结果为1,所以 ZF = 0,结果有1(奇数)个1,所以 PF = 0,结果的符号位为0,所以 SF = 0)

mov al, 7Dh      ;ZF = 0,PF = 0,SF = 0,CF = 1,OF = 0(传送指令,不影响标志寄存器的状态)

add al, 0Bh      ;ZF = 0, PF = 1,SF = 1,CF = 0,OF = 1(对于无符号数来说,0111 1101b + 0000 1011b = 1000 1000b,没向更高位进位,所以 CF = 0,对于有符号数来说,0111 1101b + 0000 1011b = 1000 1000b = -8,实际上换成十进制是 125 + 11 = 136,溢出了,所以 OF = 1,结果为 -8,所以 ZF = 0,结果有 2(偶数)个1,所以 PF = 1,结果的符号位为1,所以 SF = 1)

6. DF(Direction Flag)

        标志寄存器的第10位是 df,方向标志位,在串行处理指令中,控制每次操作后si、di的增减。

df = UP = 0:每次操作后si、di递增,即:(si) = (si) + 1; (di) = (di) + 1;

df = DN(down)= 1:每次操作后si、di递减,即:(si) = (si) - 1; (di) = (di) - 1;

注:本文是学习笔记

《汇编语言(第4版)》- 王爽

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科技大通缩

BCG 增长份额矩阵的经典“摇钱树”象限。 来源:Understanding the BCG Growth Share Matrix and How to Use It  S 曲线的暴政 要了解这如何应用于科技行业,我们需要了解 S 曲线现象。 成功产品带来的价值通常会经历 S 曲线增长&#xff…

Python办公自动化 生成房产销售的分析报告【2】

学好办公自动化,走遍天下都不怕!! 办公三件套Excel、Word 和PPT。前面已经学习过如何处理excel数据以及批量自动生成word文档。 今天主要是利用前面学习的python-pptx模块并且根据房屋销售信息生成分析报告。报告总共6页内容,包括…

C++进阶之智能指针

一、为什么需要智能指针 下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析MergeSort 函数中的问题。 int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; }…

机器人学——逆向运动学(机械臂)

正/逆运动学对比 求解 求解目标 Reachable workspace 与 Dexterous workspace Subspace 解的数目 多重解 解的选择 求解方法 栗子一 x,y,fai已知,求解theta(1,2,3)的具体数值 几何法 余弦定理定义:对于任意三角形ABC,设其三个内角分别为…

Behind the Code:Ewald Hess 带你一起深度解读链上能源与外交

2024 年 9 月 14 日,《Behind the Code: Web3 Thinkers》第二季第九集上线。在本集中,Ewald Hess 深入剖析了区块链技术在推动能源市场变革中的关键作用。长期以来,传统能源行业因垄断和低效饱受批评,但随着 Bitcoin 和 Ethereum …

企业入驻西安国际数字媒体产业园的十大好处

在当今数字化飞速发展的时代,企业的发展需要依托创新的平台和资源的整合。西安国际数字影像产业园,作为数字产业的引领者,为入驻企业提供了众多独特的优势和机遇。 好处一:产业集聚效应。西安国际数字影像产业园汇聚了众多数字媒体…

字符函数内存函数———C语言

字符分类函数 头文件: ctype.h 函数功能iscntrl判断字符是否为控制字符isspace判断字符是否为空白字符(空格,换页、换行、回车、制表符或垂直制表符)isdigit判断字符是否为十进制数字isxdigit判断字符是否为十六进制数字(0-9)(a…

二分+划分型dp,CF 360B - Levko and Array

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 B - Levko and Array 二、解题报告 1、思路分析 最小化最大值&#xff0…

射频前端加LNA放大具体应用方案介绍

1.1编写目的 接收机为了适应在一些应用场合要求,需要增大接收强度,必要时在前段增加一个低噪声放大器LNA以增大链路增益,本文编写一个最简单的低成本的LNA,记录是想给大家一个引导思路或借鉴。 1.2背景 以micrf220这款芯片在…

A4-80内六角螺栓产品特性及应用

A4-80内六角螺栓是一种常用的紧固件,广泛应用于需要高强度和耐腐蚀性能的各种场合。下面我们就来科普一下A4-80内六角螺栓的产品特性和应用场景。 产品特性 材质 A4-80内六角螺栓通常采用A4等级的不锈钢材料制成,这意味着它们具有优异的耐腐蚀性能&#…

【R语言】基于多模型的变量重要性图 (Variable Importance Plots)

变量重要性图 Variable Importance Plots 1. 写在前面2.1数据导入2.2 模型训练2.3 变量重要性2.4 变量重要性图2.5 模型模拟验证3.基于caret包计算变量重要性 1. 写在前面 好久没有更新博客了,正好最近在帮老师做一个项目,里面涉及到了不同环境变量的重要…

基于鸿蒙Next模拟扫图识物的一个过程

一、功能介绍(基础) 基于鸿蒙Next模拟扫图识物的一个过程,扫描到图片,提示出相关的图片内容,是一个什么东西。 二、使用场景(大类) 支付、社交、信息获取、在线调查、教育学习等等。 三、实现…

Vue指令:v-cloak、v-once、v-pre 指令

1、v-cloak 指令 v-cloak 指令可以隐藏未编译的 Mustache 标签直到实例准备完毕&#xff0c;否则在渲染页面时&#xff0c;有可能用户会先看到 Mustache 标签&#xff0c;然后看到编译后的数据。 &#xff08;1&#xff09;设置CSS样式 display:none <style type"te…

别再盲目推广了!用Xinstall,效果翻倍

在移动互联网时代&#xff0c;App的运营推广成为了开发者们最为关注的话题之一。然而&#xff0c;随着市场竞争的加剧&#xff0c;推广难度也越来越大。这时候&#xff0c;一款名为Xinstall的品牌走进了我们的视线&#xff0c;它以其独特的技术和解决方案&#xff0c;为App推广…

【系统架构设计】软件架构设计(2)

【系统架构设计】软件架构设计&#xff08;1&#xff09; 软件架构概述架构需求与软件质量属性软件架构风格层次系统架构风格面向服务的架构SOA概述微服务微服务和SOA差异 软件架构概述 架构需求与软件质量属性 软件架构风格 层次系统架构风格 面向服务的架构 SOA概述 面…

【生日视频制作】教师节中秋节国庆节直升飞机AE模板修改文字软件生成器教程特效素材【AE模板】

飞机生日视频制作教程AE模板改文字特效广软件告生成器玩法素材 怎么如何做的【生日视频制作】教师节中秋节国庆节直升飞机AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片或文字 渲染出视频…

一起学Java(3)-Java项目构建工具Gradle和Maven场景定位和优缺点对比

在第一步创建的项目&#xff08;java-all-in-one&#xff09;项目里&#xff0c;我们提到了使用Gradle作为项目构建工具。看到这里&#xff0c;不知道你是否有疑惑&#xff0c;什么是项目构建工具。Java项目常用构建工具有哪些&#xff1f;都有什么特点&#xff1f; 带着疑惑&…

网络安全——基础知识记忆梳理

1. SQL注入攻击 SQL注入攻击是一种常见的网络安全威胁&#xff0c;它利用Web应用程序中对用户输入的数据的不正确处理&#xff0c;攻击者可以在SQL查询中注入恶意代码&#xff0c;从而执行非授权的数据库操作。这种攻击方式可以导致数据泄漏、数据篡改、绕过认证等多种安全问题…

【java计算机毕设】足浴城消费系统小程序MySQL ssm vue uniapp maven项目设计源代码 编程语言 小组课后作业 寒暑假作业

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】足浴城消费系统小程序MySQL ssm vue uniapp maven项目设计源代码 编程语言 小组课后作业 寒暑假作业 2项目介绍 系统功能&#xff1a; 足浴城消费系统小程序包括管理员、用户、商家三种角色。 管理员功能&…

Linux基础I/O之文件缓冲区

一、缓冲区的基本概念 缓冲区这个概念&#xff0c;我相信大家或多或少的有听到过&#xff0c;那么其到底是个什么东西呢&#xff1f; 简单地理解一下&#xff0c;其可以被看做一部分的内存&#xff08;可以认为是malloc来的&#xff09;。 那为什么要有缓冲区这个东西呢&#x…