标志寄存器2015.1.19
一、
1、进位标志寄存器CF(Carry Flag):如果运算结果的最高位产生了一个进位或借位,那么其值为1,否则为0
MOV AL,0xEF MOV AL,0xFE
ADD AL,2 ADD AL,2
先在EAX中放入5555FFFF再加1,EAX变成55560000,此时看EAX首位是5没有进位,所以CF是0
同理把EAX的后四位AL放上最大的数FF再加一,此时进位,CF为1
2、奇偶标志PF:用于反应运算结果中“1”的个数的奇偶性,若“1”的个数为偶数,则PF值为1,反之为0
MOV AL,3 EAX后两位由00变成03
ADD AL,3 在03基础上加3变06,06的二进制是0110,有2个1是偶数,所以PF为1
ADD AL,2 加2后由06变08,08二进制是1000,只有一个1,所以PF为0
注意!判断1的个数是看最低有效字节
AX中MOV一个0803二进制是0000 1000 0000 0011,加一后变成0000 1000 0000 0100,(注意)此时是看最低有效字节即看04的二进制0000 0100中有多少个1才判断P位为多少
此时只有一个1,P位为0
再加一个1,为05,二进制是0000 0101,有两个1,P位为1
3、辅助进位标志AF
(1)若是32位二进制转换成8位16进制:FFFFFFFF,则观察从前往后数第5位进不进位,进位则A位为1
输入32位的数55EEFFFF再加2变成55EF0001,第五位F已进位,则A位是1
(2)若是16位二进制转换成4位16进制:FFFF,则观察从前往后数第三位进不进位,进位则AF为1
5EFE加2变成5F00,已进位则A为1
4、零标志ZF:
XOR EAX,EAX EAX与EAX异或结果都是0,所以也是清零效果,运算结果为0,Z位为1
XOR EAX,EAX会影响标志位,与MOV EAX,0(也可以把EAX变成0)相比MOV指令不修改寄存器的值
5、符号标志SF:(要注意数据宽度,最高位由数据宽度决定,如EAX是32位二进制就有8位16进制,但是AL只有2位16进制只占最后两位,00000052看进位是看5的位置)
MOV AL,7F
ADD AL,2 7F的二进制是01111111,再加2要进位,首位(符号位)0会变成1,S位也会又0变成1(但是S位为1时只能说明最高位为1不能说明这个数一定是个负数)
(MOV指令不改变标志寄存器)
6、溢出标志OF:(与CF区别开,做无符号运算时关注的CF,有符号运算关注OF)
根据上面的圆:
正加正超过7F就为负数了,若为负数此时溢出(若是无符号数看相加有没有超过FF,超过则溢出)
负加负超过FF为正,此时溢出
补充:
符号位是最前面的那位,两个数进行相加产生进位则为1,符号位后面一位为最高有效数值位没有产生进位为0,此时1和0进行异或得到O位为多少