首页 > 编程语言 >常用汇编指令对标志位的影响

常用汇编指令对标志位的影响

时间:2022-12-27 15:45:16浏览次数:55  
标签:标志 汇编 常用 符号 CF 指令 被减数 减数

加法指令 ADD (addition)

指令对标志位的影响:

                     CF=1   最高有效位向高位有进位

                     CF=0   最高有效位向高位无进位

                     OF=1   两个同符号数相加(正数+正数 或 负数+负数),结果符号与其相反。

                     OF=0   两个不同符号数相加,或同符号数相加,结果符号与其相同。

 

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

指令对标志位的影响:

                     CF=1   最高有效位向高位有进位

                     CF=0   最低有效位相高位无进位

                     OF=1   两个同符号数相加,结果符号与其相反,

                     OF=0   两个同符号数相加,或同符号相加,结果符号与其相同

 

1指令 INC (increament)

指令对标志位的影响:

                     对CF无影响

                     OF=1   两个同符号数相加,结果符号与其相反,

                     OF=0   两个同符号数相加,或同符号相加,结果符号与其相同。

 

减法指令 SUB (subtract)

指令对标志位的影响:

                     CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                     CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

 

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

指令对标志位的影响:

                     CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                     CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

 

1指令 DEC (decrement)

指令对标志位的影响:

 

                     对CF无影响

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

                   

比较指令 CMP (compare)

指令对标志位的影响:

                     CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                     CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

 

求补指令 NEG (negate)

指令对标志位的影响:

 

                     CF=1  不为0的操作数求补时

                     CF=0  为0的操作数求补时

                     OF=1    操作数为-128(字节运算)或操作数为-32768(字运算)

                     OF=0    当求补运算的操作数不为-128(字节)或-32768(字)时

 

 

无符号乘法指令 MUL (unsigned multiple)    有符号乘法指令 IMUL(signed muliple)

指令对标志位的影响:乘法指令只影响标志位CF和OF,其他条件码位无定义。

                     MUL指令的条件码设置为:

                     CF OF=0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX))

                     CF OF=1 1 乘积的高一半不为0

                     IMUL指令的条件码设置为:

                     CF OF=0 0 乘积的高一半为低一半的符号扩展.

                     CF OF=1 1 其他情况

 

无符号数除法 DIV (unsigned divide)     带符号数除法 IDIV (singed divide)

指令对标志位的影响:不影响条件码。   

 

逻辑与 AND (logic and)

指令对标志位的影响:

 

                     指令执行后 CF 和 OF 置零,AF无定义。

                     PF=1 结果操作数中1的个数为偶数时置1

                     PF=0 结果操作数中1的个数为奇数时置0

 

逻辑或 or (logic or)

指令对标志位的影响:

 

                     令执行后 CF 和 OF 置零,AF无定义。

                     PF=1 结果操作数中1的个数为偶数时置1

                     PF=0 结果操作数中1的个数为奇数时置0

 

逻辑非 NOT (logic not)

指令对标志位的影响:对标志位无影响

 

异或 XOR (exclusice or)

指令对标志位的影响:

 

                     令执行后 CF 和 OF 置零,AF无定义。

                     PF=1 结果操作数中1的个数为偶数时置1

                     PF=0 结果操作数中1的个数为奇数时置0

 

测试指令 TEST

指令对标志位的影响:

 

                     令执行后 CF 和 OF 置零,AF无定义。

                     PF=1 结果操作数中1的个数为偶数时置1

                     PF=0 结果操作数中1的个数为奇数时置0

 

逻辑左移 SHL (shift logical left)

指令对标志位的影响: CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

逻辑右移 SHR (shift logical right)

指令对标志位的影响:CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

算术左移 SAL (shift arithmetic left)

指令对标志位的影响:CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

算术右移SAR (shift arithmetic right)

指令对标志位的影响:CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

循环左移 ROL (rotate left)

指令对标志位的影响:CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

循环右移 ROR (rotate right)

指令对标志位的影响:CF=移入的数值

                     OF=1 当cnt=1时,移动后最高位的值发生变化。

                     OF=0 当cnt=1时,移动时最高位的值未发生变化。

 

带进位的循环左移 RCL (rotate left through carry)

指令对标志位的影响:CF=移入的数值。

                     OF=1 当cnt=1时,移动后最高位的值未发生变化。

                     OF=0 当cnt=1时,移动后最高位的值发生变化。

                     SF、ZF、PF标志位不受影响。

 

带进位的循环右移 RCR (rotate right through carry)

指令对标志位的影响:CF=移入的数值。

                     OF=1 当cnt=1时,操作数最高位的值未发生变化。

                     OF=0 当cnt=1时,操作数最高位的值发生变化。

                     SF、ZF、PF标志位不受影响。

 

串传送 MOVSB / MOVSW (move string byte/word)

指令对条件码的影响:不影响条件码。

 

存串 STOSB / STOSW (stroe from string byte/word)

指令对条件码的影响:不影响条件码。

 

取串LODSB / LODSW (load from string byte/word)

指令对条件码的影响:不影响条件码。

 

串比较 CMPSB / CMPSW (compare string byte/word)

指令对条件码的影响:

                     CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                     CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

 

串扫描 SCASB / SCASW (scan string byte / word)

指令对条件码的影响:

                     CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                     CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                     OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                     OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

 

条件转移指令

 

指令的汇编格式及功能    根据条件码的值转移:

49、JZ(JE) OPR         ZF=1

50、JNZ(JNE) OPR      ZF=0

51、JS OPR             SF=1

52、JNS OPR           SF=0

53、JO OPR             OF=1

54、JNO OPR          OF=0

55JP OPR             PF=1

56、JNP OPR           PF=0

57JC OPR             CF=1

58、JNC OPR           CF=0

 

比较两个无符号数,根据比较的结果转移

59JB(JNAE,JC)   OPR   CF=1            被减数小于减数则转移

60JNB(JAE,JNC) OPR    CF=0            被减数大于或等于减数则转移

61、JBE(JNA) OPR        CF或ZF=1       被减数小于或等于减数则转移

62、JNBE(JA) OPR        CF或ZF=0       被减数大于减数则转移

 

比较两个带符号数,根据比较结果转移

63JL/JNGE OPR       SF异或OF=1           被减数小于减数则转移   

64、JNL/JGE           SF异或OF=0               被减数不小于减数则转移

65、JLE/JNE           (SF异或OF)与ZF=1     被减数不大于减数则转移

66、JNLE/JG           (SF异或OF)与ZF=0     被减数大于减数则转移

 

根据CX寄存器的值转移

67JCXZ              (CX)=0               CX内容为零 则转移

最后,说一下关于一个指令对于两个相同操作数的情况(PS:之前一直感到困惑,为啥test经常操作两个相同的操作数,结合指令的对于标志位的影响就能明白这样做的意图,下面我来举例说明)

 

例子:

:00401098 50 push eax 
:00401099 8BCF mov ecx, edi 
:00401056 52  push edx 
:00401057 8BC8 mov ecx, eax 
:00401059 E8021D0100 call 00412D60 
:0040105E 85C0 test eax, eax 
:00401060 7421 je 00401083

标红的这句test比较了eax的值,将会影响标志位SF、ZF、和PF标志位,并将CF和OF。如果eax为0则标志位SF=0,ZF=1,PF=0,CF,0F=0.

 

由于ZF=0,所以下一句将会执行跳转。说白了,这里test指令就是用来检测eax是否为零的!

附上各个标志位含义

 

CF:    进位标志符号比         排在第0位
PF:    奇偶标志            排在第2位
AF:    辅助进位标志          排在第4位
ZF:    零标志             排在第6位
SF:    符号标志            排在第7位
TF:    追踪标志             排在第8位
IF:    中断允许标志            排在第9位
DF:    方向标志             排在第10位
OF:    溢出标志             排在第11位

标签:标志,汇编,常用,符号,CF,指令,被减数,减数
From: https://www.cnblogs.com/mooncatcatcat/p/17008204.html

相关文章

  • linux vi 编辑器常用命令
    1、打开命令:vi+filename(还有各种打开的姿势,只不过我比较顺手这个)2、退出命令::q退出而且不保存修改的内容:q!强制退出不保存修改的内容:wq退出并且保存修改的内容:wq!......
  • 常用Linux命令
    free-g显示内存状态Linuxfree命令|菜鸟教程(runoob.com)uptime命令执行结果:11:10:42up4days,19:23,2users,loadaverage:3.17,3.45,3.......
  • MYSQL的常用实用功能
    (1)showcreatetable比如>>desc'order' 能够看到order表中的字段名称、字段类型、字段长度、是否允许为空,是否主键、默认值等信息。不能看到该表的索引信息查看字段和索......
  • 嵌入式:ARM常用开发编译软件介绍
    编译器介绍1、ADS1.2ADS(ARMDeveloperSuite),是在1993年由Metrowerks公司开发是ARM处理器下最主要的开发工具。他的前身是SDT,SDT是ARM公司几年前的开发环境软件,目前SDT早已......
  • 常用的js正则验证整理
    原文链接:点我一、校验数字的js正则表达式1数字:^[0-9]*$2n位的数字:^\d{n}$3至少n位的数字:^\d{n,}$4m-n位的数字:^\d{m,n}$5零和非零开头的数字:^(0|[1-9][0-9]*)......
  • 常用网页播放器代码(1)
    WMP加入了ActiveX解码器控件,不仅可以放曲子,还能放Flash和其它视频文件<objectalign=middleclassid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95"class=OBJECTid=Med......
  • git输入指令出现冒号(:)的情况
    1:出现冒号(:)说明当前指令返回的结果过多并未显示完全--如果想要继续查看可以继续按回车键或者↓继续查看,直到出现END提示符或者任何时候按“q”退出2:还有中......
  • docker 常用命令大全
    参考地址:https://blog.csdn.net/leilei1366615/article/details/106267225文章目录(一)docker基础命令(二)docker镜像命令(三)docker容器命令(四)自己提交一个镜像(五)docker运......
  • 50个工作中最常用excel技巧 excel常用技巧大全
    50个工作中最常用excel技巧?Excel是一款非常常用的数据表格处理软件,很多工作上的内容都需要使用到excel进行处理,不过新手在使用excel处理数据时常常会比较慢,这是因为没有掌......
  • Shell笔记:编写脚本常用语法
    本文记录的是工作中编写脚本的常用语法整理,比较零散,有错欢迎指正。一、文件第一行文件的第一行通常为#!/bin/bash或#!/bin/sh,#!用于指定这个脚本文件使用什么解释......