目录
6.1 arm的 condition code flag 的详细讲解
6.1.1C
6.1.2Z
6.1.3N
6.1.4V
6.1 arm的 condition code flag 的详细讲解
在这篇文章中,我更加严格与严谨的讲解一下 arm的四个condition code flags,因为这个在汇编中还是非常重要的。
6.1.1C
在这个之中,C表示最后的结果有没有溢出,判断加法最后有没有进位,而减法有没有借位,如果是这样的,那么C将会成为1,否则C是0。
MOV R0, #0xFF ; 将无符号最大值255 (0xFF)放入R0
ADD R0, R0, #1 ; 加1,结果变成256
0xFF是8bits中最大的值255,如果再加一,那么将会成为256就是会有9bits所以将会发生借位,所以答案C=1
再举一个例子
11010000+11110010
那看看这个C咋样,首先得会计算这个玩意吧,加出来会成为111000010,所以这里有9bits了所以C=1
6.1.2Z
z代表的是zero flag这个还是很简单能理解的,就像我之前说的看他有没有作用,不能没有作用吧,这个就是看他是不是零,是零就是1,不是零就是0,同样也有例子
LDR R1, =0x80000000
LDR R2, =0xFFFFFFFF
ADDS R0, R1, R2
结果是0x7FFFFFFF,这可不是零啊,所以说这个Z=0,这个flag非常简单,因为就判断它是不是零就完事了。
6.1.3N
n flag是判断这个数字是不是负数的一个flag,这个也非常简单,但是这个是不是负数,再二进制的时候非常好判断,但是到十六进制就没有那么好判断。
举一个例子来说
还是这个,
11010000+11110010 ,答案上面也算出来了1 11000010,这个8bits,所以前面的那个就可以不要了(C=1),那么你看这个11000010最左边的是1,那么这个就是负数,那么这个N =1。
LDR R1, =0x40000000
LDR R2, =0x40000000
ADDS R0, R1, R2
那这个N是0还是1呢,其实这个加起来非常简单,答案是0x80000000,但是这个是正数还是负数呢?只能先转成2进制,那么这个将会非常麻烦,我们总结了一个规律。
正数:0x00000001--0x7FFFFFFF
负数:0x80000000--0xFFFFFFFF
当然还有一个0(既不是正数,也不是负数):0x00000000,
在flag的判断中是负数的为1,其他的就是0,所以在这里,0x80000000很抱歉并不是正数,是负数,所以N=1
6.1.4V
这个是这几个中比较难的一个flag,这个表示的是我最后运算好的值不能超过我2进制8bits中的补码范围。也就是这样一个范围。如果我超出了这个范围,那么V=1,不然的话就没啥事情了。所以在这里如果是一个负数与一个正数相加的话,其实100%V=0的,但是正数加正数与负数加负数就不一定了,因为一个很可能会超过最大值,一个很可能会小于最小值。这个时候其实转成十进制就能解决问题,同样我们也并不想转十进制,所以我这里还是总结了一个结论
- 两数同为正,相加结果却变为负,说明溢出。
- 两数同为负,相加结果却变为正,也说明溢出。