【汇编语言】状态标志符(CF/OF/SF/ZF)在运算(ADD/SUB/ADC/SBB)过程中的响应变化

目录

      • 各类运算时状态标志的响应变化
        • 标志符在各种`ADD`运算下的响应情况
        • 标志符在各种`SUB`运算下的响应情况
      • 借助标志符实现多位数之间运算
        • `ADC`(add with carry)带进位加法指令
        • `SBB`(subtract with borrow)带借位减法指令

各类运算时状态标志的响应变化

标志符具体含义
CF(Carry Flag)进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
OF(Overflow Flag)溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值为1,否则,OF的值为0
SF(Sign Flag)符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1
ZF(Zero Flag)零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位

在做操作数的运算时,计算机并不知道操作数是无符号数还是有符号数。因此计算机将两种情况都考虑到了,其中CF标志符用于反映无符号数的进位与借位情况,而OF则反映有符号数的溢出情况

无符号数:其值总是非负的,二进制中没有符号位,全用于表示值的大小。例如,8位的无符号数可表示的范围为 0(0000 0000) ~ 255(1111 1111)

有符号数:其值有正负之分,二进制中的最高位为符号位(0表示正,1表示负),其余位则用于表示值的大小。计算机阅读某个数将其视为有符号数时,总是将其看作是补码(非负数补码为其本身,负数补码为其源码取反再加1)的形式,例如,0000 0011 + 1111 1111 加法运算看作有符号数时,即为 (+3)+(-1)=(+2),8位的有符号数表示的范围为 -128(1000 0000(补码)) ~ +127(0111 1111)

标志符在各种ADD运算下的响应情况

  • 无符号数和有符号数都正常
    00000011+0000010000000111\begin{array}{r} 0000\ 0011 \\ +0000\ 0100 \\ \hline 0000\ 0111 \end{array}0000 0011+0000 01000000 0111
    无符号数:3+4=73+4=73+4=7,这里显然未产生进位,因此CF = 0
    有符号数:(+3)+(+4)=(+7)(+3)+(+4)=(+7)(+3)+(+4)=(+7),这里两个正数相加,结果也为正数,未产生溢出OF = 0

  • 无符号数有溢出
    00000011+11111111100000010\begin{array}{r} 0000\ 0011 \\ +1111\ 1111 \\ \hline {\color{Red} 1} \ 0000\ 0010 \end{array}0000 0011+1111 11111 0000 0010
    无符号数:3+255=2(258)3+255=2(258)3+255=2(258),这里结果为2是因为8位数的运算结果也只保留8位,显然产生了进位即为结果最高位红色的1,因此CF = 1
    有符号数:(+3)+(−1)=(+2)(+3)+(-1)=(+2)(+3)+(1)=(+2),这里第二个数表示为(−1)(-1)(1)是因为上面提到的“计算机总是将有符号数看作补码”,而两个异号(符号位相异)的有符号数相加的结果总是在可表示范围内(同样只看8位结果,不将进位作为结果的一部分,而一个正数加一个负数,其结果若为正,必然不会大于该正数;结果为负,必然不会小于该负数),因此OF = 0

    异号两数相加,OF总为0

  • 有符号数有溢出
    00000011+0111111010000001\begin{array}{r} 0000\ 0011 \\ +0111\ 1110 \\ \hline 1000\ 0001 \end{array}0000 0011+0111 11101000 0001
    无符号数:3+126=1293+126=1293+126=129,未产生进位,CF = 0
    有符号数:(+3)+(+126)=(−127)(+3)+(+126)=(-127)(+3)+(+126)=(127),两个正数相加后结果却为负数(加数的符号位与结果的符号位相异),显然出现了溢出,溢出OF = 1

  • 无符号数和有符号数都溢出
    10000001+10000010100000011\begin{array}{r} 1000\ 0001 \\ +1000\ 0010 \\ \hline {\color{Red} 1} \ 0000\ 0011 \end{array}1000 0001+1000 00101 0000 0011
    无符号数:129+130=3(259)129+130=3(259)129+130=3(259),同第二个情况产生了进位,CF = 1
    有符号数:(−127)+(−126)=(+3)(-127)+(-126)=(+3)(127)+(126)=(+3),同第三个情况结果与加数的符号相异,故发生溢出,OF = 1

SF标志位即为结果最高位的值,用来反映有符号数运算结果的正负性,四个情况依次为:0 0 1 0
ZF标志反映结果是否为0,四个情况结果均不为0, 故ZF均为0

标志符在各种SUB运算下的响应情况

  • 无符号数和有符号数都溢出
    101110010−1001001111011111\begin{array}{r} {\color{Red} 1} \ 0111\ 0010\\ -1001\ 0011\\ \hline 1101\ 1111 \end{array}1 0111 00101001 00111101 1111
    无符号数:114−147=223114-147=223114147=223,由于被减数小于减数,不够减,这时计算机允许被减数向高位借位,因为不存在实际的高位,就体现在CF标志位,当减法运算中需要解位时,将CF标志位置1,故CF = 1,此时说明无符号数运算的溢出
    有符号数:(+114)−(−109)=(−33)(+114)-(-109)=(-33)(+114)(109)=(33),被减数是正数,减数是负数,正数减负数结果应该为正数,而运算结果却为负数,说明发生了溢出,OF = 1

  • 无符号数有溢出
    101100011−0111110111100110\begin{array}{r} {\color{Red} 1} \ 0110\ 0011\\ -0111\ 1101\\ \hline 1110\ 0110 \end{array}1 0110 00110111 11011110 0110
    无符号数:99−125=23099-125=23099125=230,同第一个情况,需要借位,故CF = 1
    有符号数:(+99)−(+125)=(−26)(+99)-(+125)=(-26)(+99)(+125)=(26)两个同号数相减,无论结果是正数或负数,都不会发生溢出(与加法相反,因为两同号数相减可看作为两异号数相加),故OF = 0

    同号两数相减,OF总为0

  • 有符号数有溢出
    10100110−0011011001110000\begin{array}{r} 1010\ 0110\\ -0011\ 0110\\ \hline 0111\ 0000 \end{array}1010 01100011 01100111 0000
    无符号数:166−54=112166-54=11216654=112,被减数大于减数,无需借位,故CF = 0
    有符号数:(−90)−(+54)=(+112)(-90)-(+54)=(+112)(90)(+54)=(+112),负数减正数结果应该为负数,而结果却为正数,发生了溢出,OF = 1

  • 无符号数和有符号数都正常
    00100110−0001001000010100\begin{array}{r} 0010\ 0110\\ -0001\ 0010\\ \hline 0001\ 0100 \end{array}0010 01100001 00100001 0100
    无符号数:38−18=2038-18=203818=20,被减数大于减数,无需借位,故CF = 0
    有符号数:(+38)−(+18)=(+20)(+38)-(+18)=(+20)(+38)(+18)=(+20),同号数相减,故OF = 0

借助标志符实现多位数之间运算

ADC(add with carry)带进位加法指令

不是attack damage carry

格式:ADC DST, SRC
操作:(DST) ← (DST)+(SRC)+(CF)
其中上式中的CF为运算前CF标志位的值

用16位指令实现32位的双精度数的加法运算。设数A存放在目的操作数寄存器DX和AX,其中DX存放高位字;数B存放在寄存器BX和CX,其中BX存放高位字

;DX=2000H, AX=8000H, A=2000 8000H
;BX=4000H, CX=9000H, B=4000 9000H
ADD AX, CX ;低位字加法
ADC DX, BX ;高位字加法
  1. ADD AX, CX

    AX:8000H+CX:9000HAX=11000H\begin{array}{r} AX:\ 8000H \\ +\ CX:\ 9000H\\ \hline AX={\color{Red} 1} \ 1000H \end{array}AX: 8000H+ CX: 9000HAX=1 1000H
    AX寄存器值为1000H1000H1000H,产生进位CF = 1

  2. ADC DX, BX
    DX:2000H+BX:4000H+CF:1BDX=6001H\begin{array}{r} DX:\ 2000H\\ +\ BX:\ 4000H\\ +\ CF:\qquad {\color{Red} 1} B\\ \hline DX=6001H \end{array}DX: 2000H+ BX: 4000H+ CF:1BDX=6001H
    CF值额外加上,即相当于加上了低位产生的进位,保证了结果的正确性,DX寄存器值为6001H6001H6001H
    20008000H+40009000H=60011000H2000\ 8000H+4000\ 9000H=6001\ 1000H2000 8000H+4000 9000H=6001 1000H

SBB(subtract with borrow)带借位减法指令

格式:SBB DST, SRC
操作:(DST) ← (DST)-(SRC)-(CF)
其中上式中的CF为运算前CF标志位的值

用16位指令实现32位的双精度数的减法运算。设数A存放在目的操作数寄存器DX和AX,其中DX存放高位字;数B存放在寄存器BX和CX,其中BX存放高位字

;DX=2001H, AX=8000H, A=2001 8000H
;BX=2000H, CX=9000H, B=2000 9000H
SUB AX, CX ;低位字减法
SBB DX, BX ;高位字减法
  1. SUB AX, CX
    AX:18000H−CX:9000HAX=F000H\begin{array}{r} AX:\ {\color{Red} 1} \ 8000H \\ -\ CX:\quad 9000H\\ \hline AX=F000H \end{array}AX: 1 8000H CX:9000HAX=F000H
    AX寄存器值为F000HF000HF000H,产生借位CF = 1

  2. SBB DX, BX

    DX:2001H−BX:2000H−CF:1BDX=0000H\begin{array}{r} DX:\ 2001H\\ -\ BX:\ 2000H\\ -\ CF:\qquad {\color{Red} 1} B\\ \hline DX=0000H \end{array}DX: 2001H BX: 2000H CF:1BDX=0000H
    CF值额外减去,即相当于减去了低位向高位借走的1,保证了结果的正确性,DX寄存器值为0000H0000H0000H
    20018000H−20009000H=0000F000H2001\ 8000H-2000\ 9000H=0000\ F000H2001 8000H2000 9000H=0000 F000H

才疏学浅,盼君指点

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

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

相关文章

Java集合unmodifiableSortedSet()方法(带示例)

集合类unmodifiableSortedSet()方法 (Collections Class unmodifiableSortedSet() method) unmodifiableSortedSet() method is available in java.util package. unmodifiableSortedSet()方法在java.util包中可用。 unmodifiableSortedSet() method is used to get a non-modi…

远控免杀专题(16)-Unicorn免杀

0x01 免杀能力一览表 几点说明: 1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。 2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

面向对象(匿名内部类在开发中的应用)

匿名内部类在开发中的应用 public class test1_NoNameInner {public static void main(String[] args) {PersonDemo yy new PersonDemo();//yy.method(new Student());yy.method(new Person() {public void show(){System.out.println("show");}});//匿名内部类当作…

【汇编语言】乘法(MUL/IMUL)

乘法(MUL/IMUL) 目录乘法(MUL/IMUL)IMUL(signed multiply)有符号数乘法MUL(unsigned multiply)无符号数乘法麻!属实是被这个有符号乘法给整麻了,教材就一行例子直接不解释了,关于标志位溢出的一…

【转】MFC学习总结

HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if ((pWnd->GetDlgCtrlID() IDC_EDIT1) && (nCtlColor CTLCOLOR_EDIT)) {   COLORREF clr RGB(255,0,0);   pDC->SetTextColor(clr);  //设置红色的文本   clr RGB(0,0,0…

NHibernate初学体验进阶篇

在上篇《NHibernate初学体检记》中&#xff0c;我参照NHibernate官方快速指南写了两个示例项目&#xff0c;在示例2的源码中充斥了如下类似的代码&#xff1a;<?XML:NAMESPACE PREFIX O />Configuration cfg new Configuration(); cfg.AddAssembly("…

eclipse快捷键

Java开发工具(Eclipse的视窗和视图概述) A:视窗 每一个基本的窗体被称为视窗 PackageExplorer 显示项目结构&#xff0c;包&#xff0c;类&#xff0c;及资源Outline 显示类的结构&#xff0c;方便查找&#xff0c;识别&#xff0c;修改Console 程序运行的结果在该窗口显示Hie…

【汇编语言】除法(DIV/IDIV)

除法&#xff08;DIV/IDIV&#xff09; 目录除法&#xff08;DIV/IDIV&#xff09;DIV(unsigned divide)无符号数除法IDIV(signed divide)有符号数除法DIV(unsigned divide)无符号数除法 格式&#xff1a;DIV SRC 操作&#xff1a; SRCSRCSRC为字节时&#xff0c;(AL)←(AX)/…

java 方法 示例_Java集合syncedSortedSet()方法与示例

java 方法 示例集合类SynchronizedSortedSet()方法 (Collections Class synchronizedSortedSet() method) synchronizedSortedSet() method is available in java.util package. java.util软件包中提供了sharedSortedSet ()方法 。 synchronizedSortedSet() method is used to …

远控免杀专题(17)-Python-Rootkit免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

项目管理软件应用浅析(转)

项目管理是在一定的约束条件下&#xff0c;以高效率地实现项目业主的目标为目的&#xff0c;以项目经理个人负责制为基础和以项目为独立实体进行经济核算&#xff0c;并按照项目内在的逻辑规律进行有效的计划、组织、协调、控制的系统管理活动。项目管理的核心技术是网络计划技…

斜视角的讨论(转)

http://school.ogdev.net/listshow.asp?page4&typeid0&categoryid5&id0&ListType2 目 录 1.1 地图和地表 1.2 斜视角游戏中的视角 1.3 Tile图片的拼接 1.4 不同地表间的过渡 1.5 地图数据结构的定义 --------------------------------------------------…

计算机网络(湖科大教书匠)

计算机网络&#xff08;湖科大教书匠&#xff09; 本文档为教学视频【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;_哔哩哔哩_bilibili】的摘录 目录计算机网络&#xff08;湖科大教书匠&#xff09;一、绪论1.2 因特网概述1.2.1 网络、互连网&#xff08;互联…

经纬度

题目描述 给定地球的两个经纬度坐标&#xff0c;问这两个点的直线距离。假设地球为球体&#xff0c;半径为6371009米。 输入描述: 第一行一个整数T表示数据组数。 接下来n行&#xff0c;每行四个数lat1, lng1, lat2, lng2分别表示两个点的经纬度。 正数表示北纬和东经。 …

远控免杀专题(18)-ASWCrypter免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

Hibernate 笔记4 实现对数据库的增删改查

1 准备 首先在mysql数据库中建表User,并添加相关信息。 user表结构如下。 ---------------------------------------------------------| Field | Type | Null | Key | Default | Extra |------------------------------------------------…

Direct3D中的绘制(3)

立方体——只比三角形稍微复杂一点&#xff0c;这个程序渲染一个线框立方体。 这个简单的绘制和渲染立方体的程序的运行结果如下图所示&#xff1a; 源程序&#xff1a; /************************************************************************************** Renders a …

远控免杀专题(19)-nps_payload免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

VS2005中使用WebDeploymentProject的问题

近来做Web项目&#xff0c;VS2005中发布网站时默认发布大批的程序集&#xff0c;这给升级网站时造成很大麻烦&#xff0c;所以偶从MS下载了个WebDeploymentProject的插件&#xff08;下载地址http://download.microsoft.com/download/c/c/b/ccb4877f-55f7-4478-8f16-e41886607a…

操作系统中的多级队列调度

多级队列调度 (Multilevel queue scheduling) Every algorithm supports a different class of process but in a generalized system, some process wants to be scheduled using a priority algorithm. While some process wants to remain in the system (interactive proce…