逆向分析入门之汇编语言基础3_自学笔记3

逆向分析入门_自学笔记1

逆向分析入门_自学笔记2

 

18. EFLAGS寄存器图解(标志寄存器)

重点:  CF,PF,AF,ZF,SF,OF

(1).进位标志CF(Carray Flage):如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则为0

MOV AL,0XFF 

ADD AL,1      //进位了 所以CF的值为1

 

(2).奇偶位PF(Parity Flag):用于反映运算的结果中“1”的个数的奇偶性。

若“1”的个数为偶数,则PF的值为1,否则其值为0。

MOV AL,3   

ADD AL,3   //0x6 = 0000 0110  因为1的个数为2(偶数个),所以PF的值为1

 

(3).辅助进位标志AF(Auxility Carray Flag):在发生下列情况时,辅助进位标志AF被置为1,否则为0:

【1】在字操作时,发生低字节向高字节进位或借位时。

【2】在字操作时,发生低4位向高四位进位或借位时。

 

如:

32位时: FFFFFFFF:他要看标红部分是否向前进位

16位时:     FFFF:他要看标红部分是否向前进位

18位时:       FF: 他要看标红部分是否向前进位

 

(4).零标志ZF(Zero Flag):零标志位ZF用来反映运算结果是否为0。

若运算结果为0,则ZF的值为1,否则其值为0,在判断运算结果是否为0时,可以使用此标志。

XOR EAX,EAX  //异或运算:相同为0,不同为1 ;所以ZF的值为1

 

(5).符号标志SF(Sign Flag):符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。

MOV AL,7F

ADD AL,2     //0x81=1000 0001 ,所以SF的值为1

 

(6)溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。

若结果超过当前运算位数所能表示的范围,则称为溢出,OF的值为1,否则,OF的值为0.

难点:最高位进位与溢出的区别:

 

进制标志表示无符号数运算结果是否超出范围

溢出标志表示有符号数运算结果是否超出范围

 

溢出主要是给有符号运算使用的,在有符号的运算中,有如下规律:

正+正=正 如果结果为负数,则说明有溢出

负+负=负 如果结果为正数,则说明有溢出

正+负    永远都不会有溢出

总结:有符号:(看OF)                             无符号:(看CF)

正数: 0    1     2   3   4……7F                           正数:0 1 2 3 4 5……FF

负数: -1  -2   -3  -4   -5……-128

           FF FE FD FC FB……80

[1,]无符号、有符号都不溢出

NOV AL,8

ADD AL,8

有符号:两数相加,和不超过7F就不会溢出

无符号:两数相加,和不超过FF就不会溢出

 

[2.]无符号溢出、有符号不溢出

MOV AL,FF

ADD AL,2

无符号:FF+2大于FF,所以溢出

有符号:FF(负)+2(正)=1(正) 不溢出

1111 1111

0000 0010

1 0000 0001

 

 

[3.]无符号不溢出、有符号溢出

MOV AL,7F

ADD AL,2

无符号:7F+2小于FF,所以不溢出

有符号:7F(正)+2(正)大于7F,所以溢出

 

[4.]无符号、有符号都溢出

MOV AL,FF

ADD AL,80

无符号:FF(正)+80(正)大于FF,所以溢出

有符号:FF(负)+80(负)小于80(负),所以溢出

注意:80(负),是16位寄存器最小的负数

 

19.ADC指令:带进位加法(ADC执行加法运算时,会将CF位的值一起加到目标操作数中。

格式:ADC r/m,r/m/imm 两边不同同时为内存,宽度要一样

ADC AL,CL

ADC BYTE PTR DS:[12FFC4],2

ADC BYTE PTR DS:[12FFC4],AL

 

20.SBB指令:带借位减法(从目的操作数中减去源操作数和进位标志位的值。

格式:SBB r/m,r/m/imm 两边不同同时为内存,宽度要一样

SBB AL,CL

SBB BYTE PTR DS:[12FFC4],2

SBB BYTE PTR DS:[12FFC4],AL

 

21.XCHG指令:交换数据 (注意:没有立即数)

格式:XCHG r/m,r/m 两边不同同时为内存,宽度要一样

XCHG AL,CL                     //互换AL,CL的值

XCHG DWORD PTR DS:[12FFC4],EAX

XCHG BYTE  PTR DS:[12FFC4],AL

 

22.MOVS指令:移动数据 内存-内存 (宽度要一样)

(将由SI作为指针的源串中的一个字节或字传送到由DI为指针的目的串,然后自动修改地址指针,指向下一字节/字。)

 

BYTE/WORD/DWORD

MOVS BYTE  PTR ES:[EDI],BYTE  PTR ES:[ESI]  简写为MOVSB

MOVS WORD  PTR ES:[EDI],WORD  PTR ES:[ESI]  简写为MOVSW

MOVS DWORD PTR ES:[EDI],DWORD PTR ES:[ESI]  简写为MOVSD

movs指令执行后,esi和edi的值都会自增相应数据宽度,即b自增1,w自增2,而d自增4。

 

补充:方向标志DF(Direction Flag)

DF值为1时,movs指令执行后,esi和edi的值都会自减

DF值为0时,movs指令执行后,esi和edi的值都会自增

 

23.STOS指令:将AL/AX/EAX的值存储到[EDI]指定的内存单元

 

MOV EAX,12345678

MOV EDI,12FFC4

STOS BYTE  PTR ES:[EDI]   简写STOSB

STOS WORD  PTR ES:[EDI]   简写STOSW

STOS DWORD PTR ES:[EDI]   简写STOSD

同上,受DF标志位的影响。

 

24.REP指令:按寄存器(ECX)中指定的次数重复执行字符指令

MOV ECX,10

REP MOVSD   //执行MOVSD指令 16次

REP STOSD

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页