EFLAGS寄存器:
查看DTDEBUG中的EFLAGS的值,然后转换成二进制的形式,并取出CF/PF/AF/ZF/SF/OF的值
记住这几个寄存器的位置和名称
1、进位标志CF(Carry Flag):如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
MOV AL,0xEF MOV AL,0xFE
ADD AL,2 ADD AL,2
2、奇偶标志PF(Parity Flag):奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
MOV AL,3
ADD AL,3
ADD AL,2
3、辅助进位标志AF(Auxiliary Carry Flag):
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
MOV EAX,0x55EEFFFF MOV AX,5EFE MOV AL,4E
ADD EAX,2 ADD AX,2 ADD AL,2
4、零标志ZF(Zero Flag):零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
XOR EAX,EAX
MOV EAX,2
SUB EAX,2
5、符号标志SF(Sign Flag):符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。
MOV AL,7F
ADD AL,2
6、溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
最高位进位与溢出的区别:
进位标志表示无符号数运算结果是否超出范围.
溢出标志表示有符号数运算结果是否超出范围.
溢出主要是给有符号运算使用的,在有符号的运算中,有如下的规律:
正 + 正 = 正 如果结果是负数,则说明有溢出
负 + 负 = 负 如果结果是正数,则说明有溢出
正 + 负 永远都不会有溢出.
1、无符号、有符号都不溢出
MOV AL,8
ADD AL,8
2、无符号溢出、有符号不溢出
MOV AL,0FF
ADD AL,2
3、无符号不溢出、有符号溢出
MOV AL,7F
ADD AL,2
4、无符号、有符号都溢出
MOV AL,0FE
ADD AL,80
ADC指令:带进位加法
格式:ADC R/M,R/M/IMM 两边不能同时为内存 宽度要一样
ADC AL,CL
ADC BYTE PTR DS:[12FFC4],2
ADC BYTE PTR DS:[12FFC4],AL
SBB指令:带借位减法
格式:SBB R/M,R/M 两边不能同时为内存 宽度要一样
SBB AL,CL
SBB BYTE PTR DS:[12FFC4],2
SBB BYTE PTR DS:[12FFC4],AL
XCHG指令:交换数据
格式:XCHG R/M,R/M/IMM 两边不能同时为内存 宽度要一样
XCHG AL,CL
XCHG DWORD PTR DS:[12FFC4],EAX
XCHG BYTE PTR DS:[12FFC4],AL
MOVS指令:移动数据 内存-内存
BYTE/WORD/DWORD
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSB
MOVS WORD PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSW
MOVS DWORD PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSD
STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的内存单元
STOS BYTE PTR ES:[EDI] 简写为STOSB
STOS WORD PTR ES:[EDI] 简写为STOSW
STOS DWORD PTR ES:[EDI] 简写为STOSD
REP指令:按计数寄存器 (ECX) 中指定的次数重复执行字符串指令
MOV ECX,10
REP MOVSD
REP STOSD
标签:逆向,MOV,AL,ADD,EFLAGS,寄存器,BYTE,PTR,溢出 From: https://www.cnblogs.com/BDAMBXA/p/17052919.html