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