签到天数: 252 天 连续签到: 0 天 [LV.8]威海将军I
|

楼主 |
发表于 2010-7-24 16:11
|
显示全部楼层
七、标志寄存器
在CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下3种功能。
1、用来存储相关指令某些执行结果;
2、用来为CPU执行相关指令提供行为依据;
3、用来控制CPU的相关工作方式。
标志寄存器又叫EFlags寄存器,它与其它寄存器不一样,其它寄存器是用来存放搂据的,都是整个寄存器具有一个含义。而EFlags寄存器是按位起作用的,也就是说,它是每一位都有专门含义,记录特定的信息。
7.1、ZF标志位
ZF标志位记录相关指令执行后,其结果是否为0,如果结果为0,那么ZF=1;如果结果不为0,那么ZF=0。
举个例子,执行如下指令;
mov eax,1
sub eax,1
mov eax,1指令执行后,eax的值为00000001H;sub eax,1 指令执行后,eax的值为00000000H,应为执行结果为0,所以ZF=1。
mov eax,2
sub eax,1
mov eax,2指令执行后,eax的值为00000002H;sub eax,1指令执行后,eax的值为00000001H,因为执行结果不为0,所以ZF=0。
7.2、PF标志位
PF标志是奇偶标志位。它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。如是1的个数为偶数,PF=1,如果为奇数,那么PF=0。
举个例子,执行指令:
mov ebx,1
add ebx,10
mov ebx,1指令执行后,ebx的值为100000011H。将100000011H转换成2进制为10001B(在计算机中,用后缀B表示二进制数,如001B就是一个二进制数,而001H则是十六进制数)。10001B中有2个1。2为偶数,所以PF=1。
mov ebx,1
add ebx,12
mov ebx,1指令执行完成后,ebx的值为00000001H;add ebx,12指令执行后,ebx的值为00000013H。将00000013H转换成2进制为10011B。10011B中有3个1。3为奇数,所以PF=0。
那么如果指行指令:sub eax,eax
eax-eax的值肯定为0,其中有0个1,而0在这里作为偶数来识别,所以PF=1。
7.3、SF标志位
SF标志位是符号标志。它记录相关批蛉 执行后,其结果是否为负。如果结果为负,SF=1;如果非负,SF=0 。
计算机中通常用补码来表示有符号的数据。计算机中的一个数据可以看做是有符号数,也可以看成是无符号数。如:00000001B,可以看作是无符号数1,或者是有符号数+1;10000001B,可以看作为无符号数129,也可以看作是有符号数-127。
上面的例子告诉我们,对于同一个二进制数,计算机可以将它当作无符号数据来运算,也可以当作有符号数据来运算。比如;
mov al,10000001B
add al,1
执行结果:al=10000001B
可以将ADD指令进行的运算当作无符号数的运算,那么ADD指令相当于计算,那么ADD指令相当于计算129+1,结果为130(10000010B);也可以将ADD指令进行的运算当作有符号数的运算,那么ADD指令相当于算-127+1,结果为-126(10000001B)。
SF标志,就是CPU对符号数运算结果的一种记录,它记录数据的正负。在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。如果我们将数据当作无符号数来运算,SF的值则没有意义,显然相关的指令影响了它的值。
执行如下指令:
mov al,10000001B
add al,1
执行后,结果为10000010,SF=1,表示:如果指令进行的是有符号数运算,那么结果为负;
mov al ,10000001B
add al,01111111B
执行后,结果为0,SF=0,表示:如果指令进行的是有符号数运算,那么结果为非负。
7.4、CF标志位
CF标志位是进位标志位。一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
举个例子来说明CF标志位的作用:
mov eax,80000000
add eax ,eax
add eax, eax
第一行指令执后,eax的值为80000000H;当执行eax+eax这一运算后,要向最高位进位,此时的值为00000000H,CF标志位为1;再次执行eax+eax运算,此时不能存在进位与借位的问题,CF寄存器的值变为0。
某些指令将影响标志寄存器的多个标记位,这些被影响的标记位比较全面地记录了指令的执行结果,为相关的处理提供了所需的依据。比如指令sub eax,eax执行后,ZF、PF、SF等标志位都要受到影响,它们分别为:1、1、0。
=======================================================================
八、算术运算指令II
8.1、ADC指令
ADC指令类似于ADD指令,都是加法运算,但它们之间也有秀大的区别。DC指令被称为带进位加法,在反汇编代码中经常看到以下格式显示的ADC指令:
ADC 操作对象1,操作对象2
功能:操作对象=操作对象1+操作对象2+CF
执行如下指令:
mov ebx,2
mov eax,1
sub eax,ebx
adc ebx,1
mov ebx,2指令执行后,寄存器ebx的值为00000002H;mov eax,1指执行后,寄存器eax的值为00000001H;sub eax,ebx指令执行后,寄存器eax的值为FFFFFFFFH,也就是十进制的-1,CF的值变为1;adc ebx,1指令执行后,ebx=ebx+1+1=00000004H。而如果把上例中的adc ebx,1换成add ebx,1, ebx的最终结果为3H,因为ADD指令不加CF标志位的数值。
8.2、SBB指令
SBB类似于SUB指令,都是减法指令。SBB指令与SUB指令的关系类似于ADC指令与ADD指令的关系。SBB指令在运算的时候要使CF标志位加入到运算中来,而SUB指令则没有将CF标志位的值加入到运算中。反汇编代码中常见到的SBB指令的格式如下:
SBB 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF
执行如下指令:
mov ebx,2
mov eax,1
mov ecx,2
sub eax,ebx
sbb ecx,1
mov ebx,2指令执行后,寄存器ebx的值为00000002H;
mov eax,1指令执行后,寄存器eax的值为00000001H;
mov ecx,2指令执行后,寄存器ecx的值为00000002H;
sub eax,ebx指令执行后,寄存器eax的值为FFFFFFFFH,也就是十进制的-1,CF的值变为1;
sbb ecx,1指令执行后,ecx=2-1-1=00000000H。
8.3、INC指令
INC指令蛔一指令,用于给操作对象进行加一操作。INC指令的格式如下:
INC 操作对象
功能:操作对象=操作对象+1
INC指令中的操作数可以是寄存器的存储器作操数,但不能是立即数和段寄存器。INC指令影响标志位OF,SF,ZF,PF和AF,不影响CF。
执行如下指令:
mov ebx,1
inc ebx
执行结果为ebx=00000002H。
8.4、DEC指令
DEC指令是减一指令,与INC指令相对。DEC指令与INC指令使用方法类似,都只有一个操作对象。
DEC 操作对象
功能:操作对象=操作对象-1
8.5、CMP指令
CMP指令是比较指令,CMP指令有两个操作数,在执行CMP指令时,类似于执行SUB指令,只不过CMP指令是不保存结果的,而只影响标志寄存器的相关标志位。在CMP之后的指令往往会通过识别标志寄存器的相关标志位来进行下一步操作。
CMP指令的格式也类似于SUB指令,其格式如下:
CMP 操作对象1,操作对象2
功能:计算机操作以象1-操作对象2,但是不会将计算结果保存到任何一个操作对象中,但是计算过后,会对标志寄存器的相关标志位进行设置。
举个例子,执行指令cmp eax,eax ,结果为0,但是并不把这个结果保存到eax中。可是标志寄存器中的相关标志位的值却受到了影响,指令执行后:ZF=1,PF=1,SF=0,CF=0。 |
|