汇编太难了(3)—— 十六进制相加减时,标志位怎么判断的问题

常见的标志位有以下这些

1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

3、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:

(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。

4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

十六进制相加减

十六进制数相加减时,通常会要你判断CF,SF,ZF,OF的变化

例1:加法

求出以下各十六进制数与十六进制数62A0之和,并根据结果设置标志位SF,ZF,CF和OF的值
(1)1234 (2)4321

在计算机中运算时,其实它是把他们对应的二进制数按照补码的形式相加的。

【1】
62A0+1234 = 74D4H
0110 0010 1010 0000
0001 0010 0011 0100
+ ----------------------
0111 0100 1101 0100

CF : 进位,没有进位,所以CF=0
SF : 符号位,最高位为0,所以SF=0
ZF : 结果不为0,ZF=0
OF: 两个数都是0开头,看成补码的话,都是正数,结果也是正数,所以没有溢出,OF=0

【2】
62A0+4321 = A5C1
0110 0010 1010 0000
0100 0011 0010 0001
+ ---------------------
1010 0101 1100 0001

CF : 进位,没有进位,所以CF=0
SF : 符号位,最高位为1,所以SF=1
ZF : 结果不为0,ZF=0
OF: 两个数都是0开头,看成补码的话,都是正数,相加超过了能表示的数值范围,结果变为负数,所以溢出,OF=1

例2:减法
求出以下各十六进制数与十六进制数4AE0的差值,并根据结果设置标志位SF,ZF,CF和OF的值
(1)1234 (2)9090

【1】
1234 - 4AE0 = C754
0001 0010 0011 0100
0100 1010 1110 0000
- ----------------------
1100 0111 0101 0100
CF: 借位,有借位,所以CF=1
SF: 符号位,最高位为1,所以SF=1
ZF: 结果不等于0,ZF=0
OF: 两个正数相减,结果只会向0靠近,不可能会溢出,所以OF=0

【2】
9090 - 4AE0 = 45B0
1001 0000 1001 0000
0100 1010 1110 0000
- ------------------------
0100 0101 1011 0000
CF: 借位,无借位,所以CF=0
SF: 符号位,最高位为0,所以SF=0
ZF: 结果不等于0,ZF=0
OF: 一个负数减一个正数,结果只会是更大的负数,但是此时结果却变成正数,所以溢出,OF=1

你可能感兴趣的:(汇编语言)