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

加法指令 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位

 

原文地址:https://www.cnblogs.com/2f28/p/9747026.html

时间: 2024-10-12 16:19:51

常用汇编指令及其影响的标志位的相关文章

常用汇编指令集合

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 常用汇编指令集合 1. gdtr 1.gdtr 读取gdt表地址 其需要六个字节,但是前两个字节并没有用处. 汇编代码: CHAR Sgdtr[6] = { NULL };    __asm {        sgdt Sgdtr;    }   查看内存地址:ff 03 00 f0 03 80   后四个字节值为 8003f000,可以用windbg r gdt

汇编--常用汇编指令与标志位关系

加法指令 ADD (addition) 指令对标志位的影响: CF=1   最高有效位向高位有进位 CF=0   最高有效位向高位无进位 OF=1   两个同符号数相加(正数+正数 或 负数+负数),结果符号与其相反. OF=0   两个不同符号数相加,或同符号数相加,结果符号与其相同. 带进位加法指令 ADC (add with carry) 指令对标志位的影响: CF=1   最高有效位向高位有进位 CF=0   最低有效位相高位无进位 OF=1   两个同符号数相加,结果符号与其相反, O

汇编常用跳转指令及检测的标志位

  助记符 条件( 执行 CMP A,B 之后的标志位) 表达式 无符号数 JB/JNAE CF=1 A < B JAE/JNB CF=0 A ≥ B JA/JNBE CF=0 and ZF=0 A > B JBE/JNA CF=1 or ZF=1 A ≤ B 有符号数 JL/JNGE SF ≠ OF A < B JGE/JNL SF=OF A ≥ B JG/JNLE SF=OF and ZF=0 A > B JLE/JNG SF ≠ OF or ZF=1 A ≤ B 无符号数或有

Android 图解逆向工程中ARM常用汇编指令(一)

我们走得太快,灵魂都跟不上了. 微小的幸福就在身边,容易满足就是天堂. 在逆向和爆破中我们经常会在IDA中接触到汇编,一般做安卓的不会太了解VB回编等,不太了解的同学可以先查看上篇文章<Android ARM常用的汇编指令合集> 再来继续我们的学习,我们先来看张图. 这个view里面有 PUSH/LDR/SUB/MOVS/BLX/SUBS/BEQ/CMP ,这些差不多都是常见的,不过也不需要看得懂,理解这个指令即可,接下来我们就来分析下这些指令分别有什么作用吧. 先引入 概念性 东西,免得大家

汇编笔记二【32位通用寄存器 以及 常用汇编指令】

一.32位通用寄存器(EAX,ECX,EDX,EBP,ESP,EBP,ESI,EDI) 二.十六位通用寄存器(AX,CX,DX,BX,SP,BP,SI,DI) 三.八位通用寄存器(AH,AL,CH,CL,DH,DL,BH,BL) 四.32位,16位,8位寄存器之间的关系 1.寄存器都是高位在前,低位在后. 2.都是包含关系,32位寄存器之中包含了16位寄存器,16位寄存器之中包含了8位寄存器. 关系如下: 五.32位的含义 一位只能放0或1,32位就意味着能放32个0或1. 所以32位最小取值为

ARM 常用汇编指令

ARM 汇编程序的框架结构 .section .data <初始化的数据> .section.bss <未初始化的数据> .section .text .global _start _start: <汇编代码> 注意: 一般是将上面结构进行简化 .text .global  _start _start: <汇编代码> 寄存器操作指令: 算术和逻辑指令: MOV :用于将一个寄存器或被移位寄存器或一个立即数移动到目的寄存器 MOV  r1 ,#8 (注意:#+

ARM常用汇编指令介绍

b     跳转指令(跳转范围为32Mb) bl    带返回地址的跳转,指令自动将下一条指令的地址复制到R14寄存器,然后跳转到指定地址去执行,执行完后返回到下一条指令处执行 pc    寄存器R15,程序计数器指向当前执行的程序地址 lr    寄存器R14,链接寄存器保存程序跳转时的返回地址 ldr   从内存中读取数据加载到寄存器中 str   将寄存器中的数据保存到内存 mov   寄存器与寄存器之间的数据传送指令,也可以将立即数传给目标寄存器 add   加法指令 sub   减法指

常用汇编指令

CMP A,B 比较A与B其中A与B可以是寄存器或内存地址,也可同时是两个寄存器,但不能同都是内存地址.这个指令太长见了,许多明码比较的软件,就用这个指令. MOV A,B 把B的值送给A其中,A与B可是寄存器或内存地址,也可同时是两个寄存器,但不能同都是内存地址. Xor a,a异或操作,主要是用来将a清空 LEA装入地址,例如LEA DX,string 将字符的地址装入DX寄存器 PUSH 压栈 POP 出栈 ADD 加法指令 格式:ADD DST,SRC 执行的操作:(DST)<-(SRC

x86汇编指令详解

80x86指令系统 80x86指令系统,指令按功能可分为以下七个部分. (1) 数据传送指令. (2) 算术运算指令. (3) 逻辑运算指令. (4) 串操作指令. (5) 控制转移指令. (6) 处理器控制指令. (7) 保护方式指令. 3.3.1数据传送指令 数据传送指令包括:通用数据传送指令.地址传送指令.标志寄存器传送指令.符号扩展指令.扩展传送指令等. 一.通用数据传送指令 1传送指令 传送指令是使用最频繁的指令,格式:MOV DEST,SRC 功能:把一个字节,字或双字从源操作数S