【MASM汇编语言快速入门】8086MASM汇编深入理解指令对标志位的影响

news2024/12/27 11:08:02

8086MASM汇编深入理解指令对标志位的影响

文章目录

  • 8086MASM汇编深入理解指令对标志位的影响
    • 0. 指令对标志位影响
      • 1. 指令对标志位影响速查表
      • 2. flags标志寄存器: 标志位含义解读
      • `flags`
        • 1. 状态标志cf, pf, af, zf, sf, of
        • 2. 控制标志df, if, tf
    • 详解:
    • 1. 传送指令
    • 2. 算术指令
    • 3. 逻辑/位指令
    • 4. 移位指令
    • 5. 分支指令: 标志位的应用
      • 1. cmp
      • 2. jmp label/r16/m16
      • 3. jcc label
        • (1) 功能:满足条件"cc"则跳转到label,否则执行下一条指令
        • (2)分类掌握
          • 1. 检查单个标志位
          • 2. 大小关系
          • 答疑:

0. 指令对标志位影响

1. 指令对标志位影响速查表

CFOFSFZFPFAF
传送指令mov, xchg, lea,push, pop, in, outxxxxxx
算术指令add, adc, sub, sbb, cmp, nego
(当成无符号数运算有进位借位则CF=1)
o
(当成有符号数运算溢出则OF=1)
oooo(低8位产生进位/高8位产生借位则AF=1)
算术指令inc, decxoooox
逻辑指令and, test, or, xor置cf=0置of=0ooox
逻辑指令notxxxxxx
移位指令shl=sal, shr, saro
(无论左移右移算数逻辑移出了1就CF=1)
o
(移位后最高位改变则OF=1)
ooox
循环移位rol, ror, rcl, rcro
(无论左移右移算数逻辑移出了1就CF=1)
o
(移位后最高位改变则OF=1)
xxxx

2. flags标志寄存器: 标志位含义解读

flags

flags = [x, x, x, x, of(11), df(10), if(9), tf(8), sf(7), zf(6), x, af(4), x, pf(2), x, cf(0)]

1. 状态标志cf, pf, af, zf, sf, of
标志位功能和取值
cf进位标志(Carry Flag)
pf奇偶标志(Parity Flag)。若PF=1,表示操作结果中“1”的个数为偶数,否则PF=0。这个标志位主要用于检查数据传送过程中的错误, 和方便软件实现奇偶校验。
af辅助进位标志(Auxiliary Carry Flag)也叫半进位标志, 若AF=1表示字节运算产生低半字节向高半字节的进位或借位,否则AF=0. 主要用于BCD码运算的十进制调整。
zf全零标志(Zero Flag)。若ZF=1,表示操作结果全为零
sf符号标志(Sign Flag)。若SF=1,表示符号数运算后的结果为负数
of溢出标志OF=1,表示当进行算术运算时,结果超过了最大范围
2. 控制标志df, if, tf
标志位功能和取值
df方向标志, 用于串指令, 若DF=1, 表示执行字符串操作时按着从高地址向低地址方向进行(si, di自减);否则DF=0。DF位可由指令控制。
if中断标志, 用于是否允许响应可屏蔽中断
tf

详解:

1. 传送指令

传送类指令都不影响标志位

操作数形式功能对标志的影响
movmov dest, src(不限制宽度)
限制:
1. seg间传送
2. mem间传送
3. 立即数传给seg
4. cs出现
传送不影响任何
xchgxchg dest, src(不限制宽度)
限制:
1. seg间传送,
2. mem间传送,
3. 立即数出现
交换两操作数不影响任何
lealea r16, mem获取有效地址不影响任何
pushpush r16/m16/i16/seg进栈不影响任何
poppop r16/m16/seg出栈不影响任何

2. 算术指令

都不允许

  1. op imm, imm
  2. op mem, mem
  3. op seg, xxx

CF, OF深入理解

  1. CF: 当成无符号数时, 加有进位则CF=1, 被减数小于减数(注意是当成无符号数时有借位)CF=1

    举例:

    真值:1 - (-2) = 3,

    补码: 0x01H - 0xFEH:

    标志: OF = 0(真值为3没溢出), CF = 1(解释为无符号数时0x01H小于0xFEH, 产生借位)

  2. OF: 用双符号位判断, 或者用真值有没有超过表示范围判断

操作数形式功能对标志影响
addadd dest, srcdest << dest + src全影响
adcadc dest, srcdest << dest + src + cf全影响
incinc r/mr/m << r/m + 1除cf 全影响
subsub dest, srcdest << dest - src全影响
sbbsbb dest, srcdest << dest - src - cf全影响
decdec r/mr/m << r/m - 1除cf 全影响
negneg r/mr/m << 0 - r/m全影响(等于用0减)
cmpcmp dest, srcdest - src全影响
  • MUL IMUL

    MUL指令若高一半不为0则of=cf=1

    IMUL指令若高一半是低一半的符号扩展则of=cf=1

    乘法指令只影响OF位和CF位,对其他位没定义

  • DIV IDIV

    除法指令对6个标志位均没定义

3. 逻辑/位指令

都不允许

  1. op imm, imm
  2. op mem, mem
  3. op seg, xxx
操作数形式功能对标志的影响
andand dest, src逻辑与置cf=of=0, sf, zf, pf, 对af无定义
testtest dest, src逻辑与(但不改变寄存器值)置cf=of=0, sf, zf, pf, 对af无定义
oror dest, src逻辑或置cf=of=0, sf, zf, pf, 对af无定义
xorxor dest, src异或置cf=of=0, sf, zf, pf, 对af无定义
notnot r/m取反不影响任何

4. 移位指令

  1. 移出1则cf=1
  2. 最高位改变则of=1(有实际意义)
  3. 对af无定义

sf, zf, pf循环移位不影响, 其他移位影响

功能对标志的影响
shl = sal(没有任何区别)为什么算术左移和逻辑左移是一样的, 因为无论是有符号还是无符号数, 左移进来的一定是0(无论从标志含义还是结果角度都是一样的,这正是补码设计的精妙之处)移出1则cf=1
最高位改变则of=1(有实际意义)
sf,pf,zf
对af无定义
shr逻辑右移移出1则cf=1
最高位改变则of=1(有符号负数必溢出)
sf,pf,zf
对af无定义
sar算术右移移出1则cf=1
最高位改变则of=1(实际上不可能溢出)
sf,pf,zf
对af无定义
rol循环左移移出1则cf=1
最高位改变则of=1(有实际意义)
对sf,pf,zf无影响
对af无定义
ror循环右移移出1则cf=1
最高位改变则of=1(有实际意义)
对sf,pf,zf无影响
对af无定义
rcl带cf循环左移移出1则cf=1
最高位改变则of=1(有实际意义)
对sf,pf,zf无影响
对af无定义
rcr带cf循环右移移出1则cf=1
最高位改变则of=1(有实际意义)
对sf,pf,zf无影响
对af无定义

5. 分支指令: 标志位的应用

1. cmp

2. jmp label/r16/m16

(1) 功能: ip << label/r16/m16

(2) 扩展:

jmp short ptr xxx 跳转范围-128~127

jmp near ptr xxx 跳转范围-32768~32767

jmp far ptr xxx

这个不止会修改ip还会修改cs, 由于代码段过长,可能导致一个段放不下的跳转

ip修改为xxx的偏移地址

cs修改为xxx的段地址, 只有jmp far ptr label, 或者jmp 段地址:偏移地址, 两种会改变cs的值

3. jcc label

(1) 功能:满足条件"cc"则跳转到label,否则执行下一条指令

条件转移指令中的条件

(2)分类掌握
1. 检查单个标志位

J[flag]/JN[flag]

考察flag位为1(J[flag])或为0(JN[flag])

其中特别的有JZ=JE(cmp后zf为1等价于两数相等), JC=JB(cmp后cf为1等价于两数看成无符号数时被减数小于减数即below)

2. 大小关系

below => B: 无符号数的小于

less => L: 有符号数的小于

greater => G: 有符号数的大于

equal => Z: 等于, 加在大小关系的后面

答疑:
  1. 为什么没有无符号数的大于? 因为光凭标志位CF无法判断被减数是否大于减数, 但是通过SF和OF可以判断, 因此有符号数和无符号数的"大于"关系合并为用SF和OF判断

  2. 为什么SF不等于OF代表小于? SF不等于OF分两种情况

    1. SF=1, OF=0, 表示结果为负数, 结果没溢出. 这种情况大家一般都能理解: OF=0说明运算结果的真值是正确的, 此时两数相减结果为负数说明被减数小于减数, 这是数学常识

    2. SF=0, OF=1, 表示结果为正数, 但是发生了溢出, 这是对被减数小于减数的一种特殊情况的补充

      先给结论: 这是在考虑负数减正数但是结果溢出了的情况

      我们来考虑怎样的情况会产生这样的标志. 以八位的减法运算来举例, 分类讨论, 先考察哪些减法会产生溢出, 再来考察SF是否=0, 揪出这种特殊的减法

      • 正数减正数: 不可能出现溢出. 原因: 正数减正数想要溢出一定是下溢, 考虑最极端情况, 最小的正数减去最大的正数: 1 - 127 = -126 > -128没有溢出
      • 正数减负数: 可能出现溢出. 原因: 正数减负数想要溢出一定是上溢, 考虑极端情况, 最小的正数减去最小的负数(绝对值最大): 真值: 1- (-128) = 129 > 127 确实产生了溢出, 但是相减后SF=1(01H - 80H = 81H, SF=1), 不满足条件
      • 负数减负数: 不可能溢出, 同正数减正数
      • 负数减正数: 可能出现溢出, 负数减正数如果溢出一定是下溢, 考虑极端情况, 最小的负数减去最大的正数: -128 - 127 = -255 < -128 狠狠的溢出了, 再考察SF, SF=0 (80H - 7FH = 01H, SF=0). 那有的同学会问了, 那要是没溢出怎么办, 那就回到了SF=1, OF=0的情况

      过程中还产生了个二级结论, 若OF=1, 1. SF=1一定是正数减负数 2. SF=0一定是负数减正数

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

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

相关文章

管理类联考–复试–政治--二十大--记忆宫殿

文章目录 整体记忆宫殿门床头柜床书桌阳台 口诀记忆法 整体 记忆宫殿 要有逻辑的放到房间了 何为逻辑&#xff0c;如下大佬总结的便是&#xff0c;或者可自行总结&#xff0c;有前后顺序&#xff0c;做事逻辑即可 第一步&#xff1a;将逻辑的点放到房间里的点&#xff0c;…

旅游管理系统 |基于springboot框架+ Mysql+Java+Tomcat的旅游管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

LCD屏的应用

一、LCD屏应用 Linux下一切皆文件&#xff0c;我们的LCD屏再系统中也是一个文件&#xff0c;设备文件&#xff1a;/dev/fb0。 如果要在LCD屏显示数据&#xff0c;那我们就可以把数据写入LCD屏的设备文件。 1.显示颜色块 LCD屏分辨&#xff1a;800*480 像素 32位:说明一个像…

一文搞懂PCL中自定义点云类型的构建与函数使用

上周猛男快乐开发时遇到个bug&#xff0c;要用pcl的函数对自定义的点云进行处理。一起解决问题时遇到了很多问题&#xff0c;解决后整理出来分享给各位参考&#xff0c;以免踩一样的坑&#x1f60a;。文章中自定义的点我用PointT来表示&#xff0c;自定义点云一般指的是pcl::Po…

C++:类之六脉神剑——默认成员函数

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为 空类 。 空类中真的什么都…

linux最佳入门(笔记)

1、内核的主要功能 2、常用命令 3、通配符&#xff1a;这个在一些启动文件中很常见 4、输入/输出重定向 意思就是将结果输出到别的地方&#xff0c;例如&#xff1a;ls标准会输出文件&#xff0c;默认是输出到屏幕&#xff0c;但是用>dir后&#xff0c;是将结果输出到dir文…

复习 --- windows 上安装 git,使用相关命令

文章目录 很少使用windows的git工具&#xff0c;这次借助这个任务&#xff0c;记录下使用过程&#xff0c;其他的等有空在整理。 其中&#xff0c;还使用了浏览器的AI小助手&#xff0c;复习了git相关的命令&#xff1a;图片放最后

Python中字符串知识点汇总,以及map()函数的使用

1.字符串的定义 字符串&#xff1a;字符串就是一系列字符。在python中&#xff0c;用引号括起来的都是字符串&#xff0c;其中的引号可以是单引号&#xff0c;也可以是双引号。 2.使用方法修改字符串的大小写 ①将字符串的字母全部改为大写&#xff1a;upper()函数 实例&…

集合系列(四) -LinkedHashMap详解

一、摘要 在集合系列的第一章&#xff0c;咱们了解到&#xff0c;Map的实现类有HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties等等。 本文主要从数据结构和算法层面&#xff0c;探讨LinkedHashMap的实现。 二、简介 LinkedHashMap可…

欧科云链:ETH Dencun升级倒计时,哪些数据需要重点关注?

2024年3月13日 21:55&#xff08;epoch 269,568&#xff09;&#xff0c;以太坊将完成坎昆-德内布升级 &#xff08;Dencun 升级&#xff09;&#xff0c;OKLink 专题数据页传送门 &#x1f449; oklink.com/eth/dencun-upgrade 此次升级的主要目标是提升 Layer 2 网络的可扩展…

排序链表的三种写法

题目链接&#xff1a;https://leetcode.cn/problems/sort-list/?envTypestudy-plan-v2&envIdtop-100-liked 第一种&#xff0c;插入排序&#xff0c;会超时 class Solution {public ListNode sortList(ListNode head) {//插入排序&#xff0c;用较为简单的方式解决ListNo…

实现MySQL分页查询的三种方式~

首先我们先来查看一下表中的所有数据&#xff1a; select * from user;如下所示&#xff0c;有5条&#xff1a; 第一种方法&#xff1a; 使用LIMIT和OFFSET关键字 -- 从第1条开始取3条记录&#xff08;第一页&#xff09; SELECT * FROM user LIMIT 3 OFFSET 0; 输出如下所…

RTP 控制协议 (RTCP) 反馈用于拥塞控制

摘要 有效的 RTP 拥塞控制算法&#xff0c;需要比标准 RTP 控制协议(RTCP)发送方报告(SR)和接收方报告(RR)数据包提供的关于数据包丢失、定时和显式拥塞通知 (ECN) 标记的更细粒度的反馈。 本文档描述了 RTCP 反馈消息&#xff0c;旨在使用 RTP 对交互式实时流量启用拥塞控制…

Hack The Box-Jab

目录 信息收集 nmap enum4linux 服务信息收集 Pidgin kerbrute hashcat 反弹shell & get user 提权 系统信息收集 端口转发 漏洞利用 get root 信息收集 nmap 端口探测┌──(root㉿ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.4 --min-rate 10000 -oA…

Linux中udp服务端,客户端的开发

UDP通信相关函数&#xff1a; ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); 函数说明&#xff1a;接收信息 参数说明&#xff1a;sockfd:套接字buf:要接收的缓冲区len:缓冲区…

UCORE 清华大学os实验 lab0 环境配置

打卡 lab 0 &#xff1a; 环境配置 &#xff1a; 首先在ubt 上的环境&#xff0c;可以用虚拟机或者直接在windows 上面配置 然后需要很多工具 如 qemu gdb cmake git 就是中间犯了错误&#xff0c;误以为下载的安装包&#xff0c;一直解压不掉&#xff0c;结果用gpt 检查 结…

基于springboot实现小区物业管理系统项目【项目源码+论文说明】

基于springboot实现小区物业管理系统演示 摘要 随着城镇人口居住的集中化加剧 &#xff0c;传统人工小区管理模式逐渐跟不上时代的潮流。这就要求我们提供一个专门的管理系统。来提高物管的工作效率、为住户提供更好的服务。 物业管理系统运用现代化的计算机管理手段,使物业的…

应用程序开发教学:医保购药系统源码搭建实战

医保购药系统作为医疗服务的重要组成部分&#xff0c;其开发不仅能够为患者提供更加便捷的购药服务&#xff0c;还能够提高医疗机构的管理效率。接下来&#xff0c;小编将为您讲解医保购药系统的源码搭建过程&#xff0c;介绍应用程序开发的基本步骤和技巧。 一、系统设计 我…

手搭手RocketMQ重试机制

环境介绍 技术栈 springbootmybatis-plusmysqlrocketmq 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3.1.7 dynamic-datasource 3.6.1 mybatis-plus 3.5.3.2 rocketmq 4.9.4 加入依赖 <dependencies><dependency><…

柚见十三期(优化)

前端优化 加载匹配功能与加载骨架特效 骨架屏 : vant-skeleton index.vue中 /** * 加载数据 */ const loadData async () > { let userListData; loading.value true; //心动模式 if (isMatchMode.value){ const num 10;//推荐人数 userListData await myA…