逆向——EFLAGS寄存器

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

 

posted @ 2023-01-15 00:42  Mast丶轩  阅读(211)  评论(0)    收藏  举报