标志寄存器

news2025/7/24 3:19:50

标志寄存器

文章目录

  • 标志寄存器
    • 1.标志寄存器概念
      • 1.1 零标志位(ZF)
      • 1.2 奇偶标志位(PF)
      • 1.3 符号标志符(SF)
      • 1.4 进位标志符(CF)
      • 1.5溢出标志符(OF)
    • 2.adc指令和sbb指令
    • 3.cmp指令
    • 4.检测比较结果的条件转移指令
    • 5.DF标志和串传送指令
    • 6.pushf和popf


1.标志寄存器概念

CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同),这种特殊的寄存器在8086CPU中,被称为标志寄存器(flag),其具有以下3种作用:

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

8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW-Program Status Word),flag寄存器是按位起作用的,它的每一位都有专门的含义,记录特定的信息

请添加图片描述


1.1 零标志位(ZF)

  1. 零标志位(Zero Flag):它记录相关指令执行后,其结果是否为0
  2. 如果结果为0,那么zf = 1(表示结果是0);如果结果不为0,那么zf = 0
mov ax, 1
sub ax, 1 ;执行后,结果为0,则zf = 1

mov ax, 2
sub ax, 1 ;执行后,结果不为0,则zf = 0

1.2 奇偶标志位(PF)

  1. 奇偶标志位(Parity Flag):它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数
  2. 如果1的个数为偶数,pf = 1,如果为奇数,那么pf = 0
mov al, 1
add al, 10 ;执行后,结果为00001011B,其中有3(奇数)个1,则pf = 0;

mov al, 1
or al, 2  ;执行后,结果为00000011B,其中有2(偶数)个1,则pf = 1

1.3 符号标志符(SF)

  1. 符号标志位(Symbol Flag):它记录相关指令执行后,其结果是否为负
  2. 如果结果为负,sf = 1;如果非负,sf = 0
  3. 计算机中通常用补码来表示有符号数据。计算机中的一个数据可以看作是有符号数,也可以看成是无符号数
    • 00000001B,可以看作为无符号数1,或有符号数+1
    • 10000001B,可以看作为无符号数129,也可以看作有符号数-127
  4. 对于同一个二进制数据,计算机可以将它当作无符号数据来运算,也可以当作有符号数据来运算
  5. CPU在执行add等指令的时候,就包含了两种含义:可以将add指令进行的运算当作无符号数的运算,也可以将add指令进行的运算当作有符号数的运算
  6. SF标志:就是CPU对有符号数运算结果的一种记录,它记录数据的正负。在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值
mov al, 10000001B 
add al, 1   ;执行后,结果为10000010B,sf = 1,表示:如果指令进行的是有符号数运算,那么结果为负;

mov al, 10000001B
add al, 01111111B   ;执行后,结果为0,sf = 0,表示:如果指令进行的是有符号数运算,那么结果为非负

1.4 进位标志符(CF)

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

请添加图片描述


1.5溢出标志符(OF)

  1. 溢出标志位(Overflow Flag):一般情况下,OF记录了有符号数运算的结果是否发生了溢出
  2. 如果发生溢出,OF = 1;如果没有,OF = 0
  3. CF和OF的区别:CF是对无符号数运算有意义的标志位,而OF是对有符号数运算有意义的标志位
  4. CPU在执行add等指令的时候,就包含了两种含义:无符号数运算和有符号数运算
    • 对于无符号数运算,CPU用CF位来记录是否产生了进位
    • 对于有符号数运算,CPU用OF位来记录是否产生了溢出,当然,还要用SF位来记录结果的符号
mov al, 98
add al, 99   ;执行后将产生溢出。因为进行的"有符号数"运算是:(al)=(al)+ 99 = 98 + 99=197 = C5H 为-59的补码
             ;而结果197超出了机器所能表示的8位有符号数的范围:-128-127;add 指令执行后:无符号运算没有进位CF=0,有符号运算溢出OF=1
             ;当取出的数据C5H按无符号解析C5H = 197, 当按有符号解析通过SP得知数据为负,即C5H为-59补码存储,
             
mov al,0F0H  ;F0H,为有符号数-16的补码   -Not(F0 - 1)
add al,088H  ;88H,为有符号数-120的补码   -Not(88- 1)
              ;执行后,将产生溢出。因为add al, 088H进行的有符号数运算结果是:(al)= -136 
              ;而结果-136超出了机器所能表示的8位有符号数的范围:-128-127;add 指令执行后:无符号运算有进位CF=1,有符号运算溢出OF=1

2.adc指令和sbb指令

adc指令的详解:

  1. adc是带进位加法指令,它利用了CF位上记录的进位值
  2. 指令格式: adc 操作对象1, 操作对象2
  3. 功能:操作对象1 = 操作对象1 + 操作对象2 + CF
mov ax, 2
mov bx, 1
sub bx, ax  ;无符号运算借位CF=1,有符号运算OF = 0
adc ax, 1   ;执行后,(ax)= 4。adc执行时,相当于计算:(ax)+1+CF = 2+1+1 = 4

请添加图片描述

;计算1EF000H+201000H,结果放在ax(高16位)和bx(低16位)中
;将计算分两步进行,先将低16位相加,然后将高16位和进位值相加

mov ax, 001EH 
mov bx, 0F000H 
add bx, 1000H
adc ax, 0020H

sbb指令的详解:

  1. sbb是带借位减法指令,它利用了CF位上记录的借位值
  2. 指令格式: sbb 操作对象1, 操作对象2
  3. 功能:操作对象1 = 操作对象1 - 操作对象2 - CF
;计算 003E1000H - 00202000H,结果放在ax,bx中,程序如下:

mov bx, 1000H
mov ax, 003EH
sub bx, 2000H
sbb ax, 0020H

3.cmp指令

  1. cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响
  2. 其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果
  3. cmp指令格式: cmp 操作对象1,操作对象2
    • 例如:指令cmp ax, ax,做(ax)-(ax)的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位。 指令执行后:zf=1,pf=1,sf=0,cf=0,of=0
  4. CPU在执行cmp指令的时候,也包含两种含义:进行无符号数运算和进行有符号数运算

如果用cmp来进行有符号数比较时,SF只能记录实际结果的正负,发生溢出的时候,实际结果的正负不能说明逻辑上真正结果的正负。但是逻辑上的结果的正负,才是cmp指令所求的真正结果,所以我们在考察SF的同时考察OF,请添加图片描述
就可以得知逻辑上真正结果的正负,同时就知道比较的结果

mov ah, 08AH  ; -Not(8A-1) = -118  即当成有符号数时为-118
mov bh, 070H  ; 有符号数时最高位为0为正数, 70H = 112
cmp ah, bh    ;(ah)-(bh)实际得到的结果是1AH 
		      ; 在逻辑上,运算所应该得到的结果是:(-118- 112 = -230
		      ; sf记录实际结果的正负,所以sf=0

对于cmp ah,bh的理解:

  1. 如果sf=1,而of=0 。 of=0说明没有溢出,逻辑上真正结果的正负=实际结果的正负; sf=1,实际结果为负,所以逻辑上真正的结果为负,所以(ah)<(bh)
  2. 如果sf=1,而of=1: of=1,说明有溢出,逻辑上真正结果的正负≠实际结果的正负; sf=1,实际结果为负。实际结果为负,而又有溢出,这说明是由于溢出导致了实际结果为负,,如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。 这样,sf=1,of=1,说明了(ah)>(bh)
  3. 如果sf=0,而of=1。of=1,说明有溢出,逻辑上真正结果的正负≠实际结果的正负;sf=0,实际结果非负。而of=1说明有溢出,则结果非0,所以,实际结果为正。实际结果为正,而又有溢出,这说明是由于溢出导致了实际结果非负,如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负。这样,sf=0,of=1,说明了(ah)<(bh)
  4. 如果sf=0,而of=0,of=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;sf=0,实际结果非负,所以逻辑上真正的结果非负,所以(ah)≥(bh)

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

  1. “转移”指的是它能修改IP,而“条件”指的是它可以根据某种条件,决定是否修改IP
  2. 比如:jcxz它可以检测cx中的数值,如果(cx)=0,就修改IP,否则什么也不做
  3. 所有条件转移指令的转移位移都是[-128,127]
  4. 多数条件转移指令都检测标志寄存器的相关标志位,根据检测的结果来决定是否修改IP
  5. 这些条件转移指令通常都和cmp相配合使用,它们所检测的标志位,都是cmp指令进行无符号数比较的时记录比较结果的标志位
  6. 根据无符号数的比较结果进行转移的条件转移指令(它们检测zf、cf的值)

请添加图片描述

简写指令补充:j:jump,e:equal,b:below,a:above,n:not

;编程,统计data段中数值为8的字节的个数,用ax保存统计结果。
mov ax, data 
mov ds, ax 
mov bx, 0   ;ds:bx指向第一个字节
mov ax, 0   ;初始化累加器mov cx,8

s:
	cmp byte ptr [bx], 8   ;8进行比较
	jne next  ;如果不相等转到next,继续循环
	inc ax  ;如果相等就将计数值加1
next:
	inc bx
	loop s ;程序执行后:(ax)=3

5.DF标志和串传送指令

  1. flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si、di的增减
    • df = 0每次操作后si、di递增
    • df = 1每次操作后si、di递减
  2. 格式:movsb,功能:将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器df位的值,将si和di递增或递减
  3. 格式:movsw,功能:将ds:si指向的内存字单元中的字送入es:di中,然后根据标志寄存器df位的值,将si和di递增2或递减2
  4. 格式:rep movsb,movsb和movsw进行的是串传送操作中的一个步骤,一般来说,movsb和movsw都和rep配合使用,功能:rep的作用是根据cx的值,重复执行后面的串传送指令
  5. 8086CPU提供下面两条指令对df位进行设置:
    • cld指令:将标志寄存器的df位置0
    • std指令:将标志寄存器的df位置1
;将data段中的第一个字符串复制到它后面的空间中。
data segment 
	db 'Welcome to masm!'
	db 16 dup (0)
data ends

mov ax, data 
mov ds, ax 
mov si, 0   ;ds:si 指向data:0
mov es, ax 
mov di, 16  ;es:di指向data:0010

mov cx, 16  ;(cx)=16,rep循环16次
cld  ;设置df=0,正向传送
rep movsb

6.pushf和popf

  1. pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器中
  2. pushf和popf,为直接访问标志寄存器提供了一种方法

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

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

相关文章

UG NX 12装配——组件位置:装配约束

利用装配约束在装配中定位组件。 选择【装配】【组件】【装配约束】命令&#xff0c;或单击【装配】工具条上的【装配约束】按钮出现【装配约束】对话框。 &#xff08;1&#xff09;接触对齐 接触对齐约束可约束两个组件&#xff0c;使其彼此接触或对齐。这是最常用的约束。…

m无线通信信道matlab仿真,包括自由空间损耗模型,Okumura-Hata模型,COST231 Hata模型,SUI信道模型

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 无线信道是移动通信的传输媒体&#xff0c;所有的信息都在这个信道中传输。信道性能的好坏直接决定着人们通信的质量&#xff0c;因此要想在有限的频谱资源上尽可能地高质量、大容量传输…

2022关键之年,国产奶粉「争霸之秋」

奶粉又到关键年。 在中国奶粉的发展历程中&#xff0c;有两个关键性的时间节点&#xff1a;2008年&#xff0c;三鹿事件打乱了国产奶粉的发展节奏&#xff0c;洋奶粉开始大行其道&#xff1b;2016年&#xff0c;婴配粉注册制实行&#xff0c;打着“更适合中国宝宝体质”旗号的…

数据库系统工程师难考吗?

数据库系统工程师属于软考中级科目&#xff0c;只要你多看书多做练习&#xff0c;熟悉考试题型&#xff0c;用对学习方法&#xff0c;并不难考的。但是你专业不对口&#xff0c;应该在备考上多下功夫&#xff0c;建议把考试大纲里的内容复习一遍&#xff0c;掌握好考纲里的知识…

使用android 提取小米手机日志

如何使用android sdk获取小米日志 下载android sdk 登录网址https://www.androiddevtools.cn/ 往下滑找到SDK tools,下载zip包并解压到电脑随便一个位置 解压缩位置打开SDK Manager.exe&#xff0c;安装相关工具&#xff08;具体可以网络搜索&#xff09; 打开电脑cmd 使用a…

世界杯听腾格尔《遥远的地方》,可以多帮助你爱的球队多进几个球

世界杯又到来啦&#xff0c;球迷朋友笑哈哈&#xff0c;听着音乐看球赛&#xff0c;球迷朋友乐开怀。——世界杯&#xff0c;中国球迷欢迎你&#xff01;随着2022年11月20号的临近&#xff0c;卡特尔世界杯即将打响&#xff0c;每一位中国球迷都为之热血沸腾。 虽然说中国的足球…

ly-tab插件动态更改高度进行多端适配

在开发移动端用ly-tab时遇到的一个小问题&#xff0c;众所周知当我们使用rem配合flexible.js时元素的高度会根据不同的设配进行自动适配&#xff0c;但是ly-tab插件的高度默认使用px为单位&#xff0c;就会导致在不同的设备中出现我们不可控的因素 比如当我们想将其定位到顶部…

[附源码]java毕业设计农产品溯源管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]java毕业设计农村留守儿童援助信息系统论文2022

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

普乐蛙大型VR模拟航空体验馆vr飞船体验馆vr航天科普馆定制

普乐蛙VR科普基地&#xff0c;拥有展示VR科普体验的设备多台&#xff0c;向观众科普及现代高科技全沉浸式虚拟现实&#xff08;VR&#xff09;技术应用&#xff0c;同时通过360度全沉浸式VR动感仿真设备体验防风防震、火灾逃生、交通安全等科普常识、寓教于乐&#xff0c;其乐无…

YOLOv5实操——检测是否戴口罩

文章目录数据集和代码的准备yolov5源码下载数据集的下载制作个人数据集数据集标注json 转 txt训练阶段模型训练可视化测试阶段数据集和代码的准备 yolov5源码下载 yolov5官方下载地址 数据集的下载 直接下载别人制作好的数据集 Mask Wearing Dataset 下载 然后将其放入与yo…

模型压缩算法库 MMRazor 全面升级,更灵活、更自动

MMRazor 是 OpenMMLab 开源项目里模型压缩领域的算法工具箱&#xff0c;目前支持了知识蒸馏、模型通道剪枝和模型结构搜索&#xff0c;模型量化部分正在开发中。 量化设计 RFC&#xff08;request for comment&#xff09;链接也放在这啦&#xff0c;欢迎各位小伙伴去提需求和建…

分享一个超好看回忆相册(代码自取)

目录 前言 正文 部分代码 单面截图 更改文档标题 更改图片 更改文字 源码 前言 Calabash Brothers 《葫芦兄弟》&#xff08;又名&#xff1a;葫芦娃&#xff09;&#xff0c;是上海美术电影制片厂于1985-1987年原创出品的13集系列剪纸动画片&#xff0c;是中国动画第…

python基于PHP+MySQL家政管理系统的设计与实现

随着大家生活水平的提高,在生活中家政服务变得越来越受大家的欢迎,如何来选择一个好的员工就也变得越来越重要,如何让人们足不出户就能找到自己满意的家政人员是本网站要解决的主要问题,我们建立一个家政公司信息系统来实现需求者从网站中快速的获取正确真实的家政服务信息的手…

阿里云账户新手实名认证教程(超简单秒通过)

阿里云账号注册后需要实名认证后才可以使用&#xff0c;阿里云百科教大家快速实名认证的方法&#xff0c;不需要上传身份证的等信息&#xff0c;以个人认证为例&#xff0c;直接拿你当支付宝扫一下即可通过实名认证&#xff0c;阿里云百科来详细说下阿里云个人或企业实名认证方…

单链表(一篇带你掌握单链表)

在之前我们已经学习了顺序表&#xff0c;顺序表有一定的缺陷&#xff0c;比如需要扩容&#xff0c;在插入和删除时需要挪动数据等问题&#xff0c;在此基础上我们可以学习一一种新的数据结构-单链表&#xff0c;相对来说它可以按需申请空间&#xff0c;并且不需要挪动数据。 我…

Spring Security登录流程分析

本文内容来自王松老师的《深入浅出Spring Security》&#xff0c;自己在学习的时候为了加深理解顺手抄录的&#xff0c;有时候还会写一些自己的想法 登录流程分析 要搞请求Spring Security认证流程&#xff0c;我们先得认识与之相关的三个基本组件&#xff1a;AuthenticationMa…

Redis——》事务

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》事务一、概念二、示例multi、execdiscardwatch三、事务发生错误1、入队阶段发生错误2、执…

数据库课程设计——学籍管理系统

目录 1 问题的提出 1 2 需求分析 2 2.1需求描述 2 2.2数据字典 3 2.2.1数据项 3 2.2.2主要的数据流定义 6 2.3数据流图和业务流图 7 2.3.1顶层数据流图 7 2.3.2第一层数据流图 8 2.3.3第一层数据流图 8 2.3.4第一层数据流图 9 2.3.5第一层数据流图 9 3 概念结构设计 10 3.1实…

docker基础命令

docker基础 docker中的三个基本概念: 镜像: Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统 容器: 镜像&#xff08;Image&#xff09;和容器&#xff08;Container&#xff09;的关系&#xff0c;就像是面向对象程序设计中的类和实例一…