标志寄存器

文章目录

  • 标志寄存器
    • 1. ZF标志
    • 2. PF标志
    • 3. SF标志
    • 4. CF标志
    • 5. OF标志
    • 6. adc指令
    • 7. sbb指令
    • 8. cmp指令
    • 9. 检测比较结果的条件转移指令
    • 10. DF标志和串传送指令
    • 11. pushf和popf

标志寄存器

flag 和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。

而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。

8086CPU的flag寄存器的结构:

请添加图片描述

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

而0、2、4、6、7、8、9、10、11位都具有特殊的含义。

1. ZF标志

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  

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

2. PF标志

flag的第2位是PF,奇偶标志位。它记录指令执行后,结果的所有二进制位中1的个数:

  • 为偶数,PF = 1;
  • 为奇数,PF = 0。

示例:

mov al,1
add al,10

执行后,结果为00001011B,其中有3(奇数)个1,则PF=0;

mov al,1
or al,10  

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

3. SF标志

flag的第7位是SF,符号标志位。它记录指令执行后结果是否为负数:

  • 结果为负,SF = 1;
  • 结果为正,SF = 0。

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

SF 标志,就是CPU对有符号数运算结果的一种记录 ,它记录数据的正负。 在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。

示例:

mov al,10000001B 	
add al,1

执行后,结果为10000010B,SF=1,

表示:如果指令进行的是有符号数运算,那么结果为负;

mov al,10000001B
add al,01111111B

执行后,结果为0,SF=0

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

4. CF标志

flag的第0位是CF,进位标志位。

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

请添加图片描述

例如

mov al,98H
add al,al  

执行后: (al)=30H,CF=1,CF记录了最高有效位向更高位的进位值

另外一种情况,而当两个数据做减法的时候,有可能向更高位借位。

比如,两个 8 位数据:97H-98H,将产生借位,借位后,相当于计算197H-98H。而flag的CF位也可以用来记录这个借位值。

5. OF标志

flag的第11位是OF,溢出标志位。

在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。

注意CF和OF的区别:

  • CF是对无符号数运算有意义的标志位
  • 而OF是对有符号数运算有意义的标志位

例如:

mov al, 98d
add al, 99d

对于无符号数运算,98+99没有进位,CF=0;对于有符号数运算,98+99发生溢出,OF=1。

6. adc指令

adc是带进位加法指令 ,它利用了CF位上记录的进位值。

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

功能:操作对象1 = 操作对象1 + 操作对象2 + CF

比如:adc ax,bx 实现的功能是: (ax) = (ax) + (bx) + CF

adc指令示例:

mov ax,2 
mov bx,1 
sub bx,ax 
adc ax,l

执行后,(ax)=4。

adc执行时,相当于计算: (ax)+1+CF=2+1+1=4。

mov ax,1 
add ax,ax 
adc ax,3

执行后,(ax)=5。

adc执行时,相当于计算: (ax)+3+CF=2+3+0=5。

在执行 adc 指令的时候加上的 CF 的值的含义,由 adc指令前面的指令决定的,也就是说,关键在于所加上的CF值是被什么指令设置的。

显然,如果CF 的值是被sub指令设置的,那么它的含义就是借位值;如果是被add指令设置的,那么它的含义就是进位值。

7. sbb指令

sbb是带错位减法指令,它利用了CF位上记录的借位值。

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

功能:操作对象1 = 操作对象1 – 操作对象 2 – CF

比如:sbb ax,bx

实现功能: (ax) = (ax) – (bx) – CF

8. cmp指令

cmp指令

格式:cmp 操作对象1,操作对象2

功能:计算操作对象1–操作对象2 但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。

例如:cmp ax,ax

做(ax)–(ax)的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位。

指令执行后:ZF=1,PF=1,SF=0,CF=0,OF=0。

其实,我们通过cmp 指令执行后,相关标志位的值就可以看出比较的结果。

请添加图片描述

同 add、sub 指令一样,CPU 在执行cmp指令的时候,也包含两种含义:进行无符号数运算和进行有符号数运算。

所以利用cmp指令可以对无符号数进行比较,也可以对有符号数进行比较。

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

因为 cmp 指令可以同时进行两种比较,无符号数比较和有符号数比较,所以根据 cmp 指令的比较结果进行转移的指令也分为两种,即:

根据无符号数的比较结果进行转移的条件转移指令,它们检测ZF、CF的值;

和根据有符号数的比较结果进行转移的条件转移指令,它们检测 SF、OF和 ZF的值。

请添加图片描述

e:表示equal;
ne:表示not equal;
b:表示below;
nb:表示not below;
a:表示above;
na:表示not above。

编程实现:如果(ah)=(bh)则(ah)=(ah)+(ah),否则 (ah)=(ah)+(bh)。

cmp ah,bh
je s
add ah,bh
jmp short ok
s: add ah,ah
ok: ret

虽然 je 的逻辑含义是“相等则转移”,但它进行的操作是,ZF=1时则转移。

“相等则转移”这种逻辑含义,是通过和 cmp 指令配合使用来体现的,因为是cmp 指令为“ZF=1”赋予了“两数相等”的含义。

10. DF标志和串传送指令

flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si,di的增减:

  • DF = 0:每次操作后si,di递增;
  • DF = 1:每次操作后si,di递减。

1)格式1: movsb

功能:以字节为单位传送

步骤1 :((es)×16 + (di)) = ((ds) ×16 + (si))

步骤2:

如果DF = 0则: (si) = (si) + 1

​ (di) = (di) + 1

如果DF = 1则: (si) = (si) - 1

​ (di) = (di) - 1

2)格式2:movsw

功能:以字为单位传送

将 ds:si指向的内存字单元中word送入es:di中,然后根据标志寄存器DF位的值,将si和di递增2或递减2。

movsb和movsw进行的是串传送操作中的一个步骤,一般来说,movsb 和 movsw 都和rep配合使用,格式为 rep movsb

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

由于每执行一次movsb指令 si 和 di 都会递增或递减指向后一个单元或前个单元,则rep movsb就可以循环实现(cx)个字符的传送。

由于flag的DF位决定着串传送指令执行后,si和di改变的方向,所以CPU应该提供相应的指令来对DF位进行设置,从而使程序员能够决定传送的方向。

8086CPU提供下而两条指令对DF位进行设置:

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

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

2)编程实现:用串传送指令,将F000H段中的最后16个字符复制到data段中。

data segment
	db 16 dup (0)
data ends

代码:

mov ax,0f000h
mov ds,ax
mov si,0ffffh   ;ds:si 指向f000:ffff
mov ax,data		
mov es,ax 
mov di,15 		;es:di 指向data:000F
mov cx,16 		;(cx)=16,rep 循环 16次
std				;设置df=1,逆向传送
rep movsb

11. pushf和popf

pushf :将标志寄存器的值压栈;

popf :从栈中弹出数据,送入标志寄存器中。

pushf 和 popf,为直接访问标志寄存器提供了一种方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MCU最小系统晶振模块设计

单片机的心脏:晶振 晶振模块 单片机有两个心脏,一个是8M的心脏,一个是32.768的心脏 8M的精度较低,所以需要外接一个32.768khz 为什么是8MHZ呢,因为内部自带的 频率越高,精度越高,功耗越大&am…

直拍打法 漫漫长夜

小时候爱玩的时候,有马琳,刘国梁这些大腿在,谁敢想象现在顶尖高手中只有一根独苗而且是欧洲本土独苗了? 小勒布伦,真*直拍之光。 有一说一,国际乒联对于器材的调整,无论是改低粘度的无机胶水&am…

Docker(七):容器监控工具(Portainer、CAdvisor)

一:轻量级可视化监控工具Portainer 可视化监控工具, 可以通过docker安装,用于管理和监控docker,基本上的docker命令都有对应的按钮来操作。 # always 表示docker重启了该容器也跟着重启 docker run -d --name portainer -p 8000:8000 -p 90…

使用docker部署数据可视化平台Metabase

目前公司没有人力开发数据可视化看板,因此考虑自己搭建开源可视化平台MetaBase。在此记录下部署过程~ 一、镜像下载 docker pull metabase/metabase:latest 运行结果如下: 二、创建容器 docker run -dit --name matebase -p 3000:3000\ -v /home/loc…

将gidp模块、ipam集成到ultralytics项目中实现gidp-yolov8、ipam-yolov8

gdip-yolo与ia-seg都是一种将图像自适应模块插入模型前面,从而提升模型在特定数据下检测能力的网络结构。gdip-yolo提出了gdip模块,可以应用到大雾数据与低亮度数据(夜晚环境),然后用于目标检测训练;ia-seg将ia-yolo中的代码修改了一下修车了ipam模块,应用到低亮度数据(…

柯桥商务口语之怎么样说英语更加礼貌?十个礼貌用语get起来!

当你在国外需要帮助的时候,这些礼貌用语真的是能够帮到你的哦 1.Would/Could you help me? 你可帮助我吗? 相信有些人想请求帮助的时候,一开口就用Can you,这个用在朋友或者熟人上面当然是没有问题的,但是如果是向…

揭秘“金松奖” | 一个金融科技行业的热门解决方案

近日,2023年度第十届“金松奖”金融科技行业评选结果正式揭晓,开源网安凭借「度小满互联网金融开源软件治理解决方案」入选合规科技发展热门方案。 “金松奖”是移动支付网主办的金融科技行业线上评选活动,旨在从企业、产品、方案和案例等多维…

ArcGIS无法链接在线地图或错误: 代理服务器从远程服务器收到了错误地址(验证服务器是否正在运行)。

这几天我们分享了! 谷歌卫星影像图归来!ArcGIS直连!快来获取_谷歌影像lyr-CSDN博客文章浏览阅读666次,点赞11次,收藏9次。大概。_谷歌影像lyrhttps://blog.csdn.net/kinghxj/article/details/137521877一套图源搞定&a…

别找了,这35份Excel自动排班表真的好用!

别再自己做排班表了,调了半天不好看格式还不对。 看看自己需要的是哪些类型的排班表?是公司值班,还是直播排班,还是考勤汇总,总有一个适合你。 刚整理的35份办公常用的排班表,希望能帮到你! …

EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测

EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测 目录 EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实…

Pytest精通指南(16)利用skip、skipif跳过用例执行

文章目录 前言skip源码分析skip装饰方法skip装饰类skip装饰模块skipif源码分析skipif装饰方法skipif装饰类skipif装饰模块拓展-用例内部跳过执行 前言 skip: skip用于无条件地跳过测试用例,无论测试环境的状态或条件如何。通常用于那些在任何情况下都不应该执行的测…

深入解析Rivest Cipher 4:理论与实践

title: 深入解析Rivest Cipher 4:理论与实践 date: 2024/4/17 20:30:58 updated: 2024/4/17 20:30:58 tags: 密码学RC4算法流密码密钥调度安全分析优缺点应用实践 第一章:引言 密码学简介: 密码学是研究如何保护通信和信息安全的学科。它涉…

国内外AI programmer 大全集--持续更新

国内: 通义灵码: 公司:阿里巴巴集团旗下的阿里云发布年份:未明确指出具体年份,但已在2024年4月3日前入职并上岗一段时间名称:通义灵码工号:AI001 iFlyCode: 公司:科大…

RabbitMQ-核心特性

已经不需要为RabbitMQ交换机的离去而感到伤心了,接下来登场的是RabbitMQ-核心特性!!! 文章目录 核心特性消息过期机制消息确认机制死信队列 核心特性 消息过期机制 官方文档:https://www.rabbitmq.com/ttl.html 可以给每条消息指定一个有效期&#xf…

git 分支-变基

在git中,将一个分支的更改集成到另一个分支有两种主要方式:合并(merge)和变基(rebase)。在本节中,将学习什么是变基,如何执行变基操作,为什么它是一个非常强大的工具&…

C++ 一个有关类模板、构造函数、析构函数、拷贝构造、重载等的数组案例分析

文章目录 概要根据代码和输出进行分析(看注释和图示)个人小结 概要 案例描述: 实现一个通用的数组类,要求如下: 可以对内置数据类型以及自定义数据类型的数据进行存储;将数组中的数据存储到堆区;构造函数…

QT-编译报库错误(LF/CRLF)

QT-安装后环境问题记录 版本和环境问题 版本和环境 QT5.15.2 Windows10 QT Creator 问题 在QT夸端开发的项目中 ,使用QTCreator打开项目pro文件,编译报出很多系统库 及本地文件中的一些问题,具体如图: 后续,我以为…

【b站李同学的Lee】Part 2 模块化开发 NodeJS+Gulp基础入门+实战

课程地址:【NodeJSGulp基础入门实战】 https://www.bilibili.com/video/BV1aE411n737/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 4 Node.js模块化开发 4.1 JavaScript开发弊端 4.1.1 文件依赖 4.1.2 命名冲突 4.2 生活中的…

Midjourney常见玩法及prompt关键词技巧

今天系统给大家讲讲Midjourney的常见玩法和prompt关键词的一些注意事项,带大家入门~(多图预警,建议收藏~) 一、入门及常见玩法 1、注册并添加服务器(会的童鞋可跳过~) …

DC-9渗透测试复现

DC-9渗透测试复现 目的: 获取最高权限以及flag 过程: 信息打点--sql注入- 文件包含漏洞-Knockd开门开启ssh连接-hyjra爆破-sudo提权(文件追加) 环境: 攻击机:kali(192.168.85.137) 靶机:DC_3(192.168.85.141) …
最新文章