4.3. Conditional Branches¶
To use the condition bits in the CPSR
, we can use condition codes that correspond to various logical combinations
of the bits. Here are the most common codes:
Code |
Meaning |
Bits |
---|---|---|
EQ |
Equal |
Z set |
NE |
Not Equal |
Z clear |
GE |
Greater or Equal |
N == V |
LT |
Less Than |
N != V |
GT |
Greater Than |
(Z == 0) && (N == V) |
LE |
Less or Equal |
(Z == 1) || (N != V) |
Tip
You are not responsible for memorizing the bits associated with each code. Focus on making sure you recognize the codes.
There are also some less common codes:
Code |
Meaning |
Bits |
---|---|---|
MI |
Negative (MInus) |
N set |
PL |
Positive or zero (PLus) |
N clear |
VS |
Overflow |
V set |
VC |
No overflow |
V clear |
HI |
Unsigned higher |
C set and Z clear |
LS |
Unsigned lower or same |
C clear or Z set |
CS |
Unsigned higher or same |
C set |
CC |
Unsigned lower |
C clear |
These codes can be added to a B
instruction to modify the circumstances under which it branches.
Like BEQ
for “branch if equal” or BGT
for “branch if greater than”.
The ARM sample below uses a conditional branch to approximate this C++ code:
if(x == 2)
y = 5;
On line 10, the assembly does a comparison between r1, where x has been loaded, and 2. Then, on line 11, the branch checks the condition bits set by that operation. If they indicate that the values were not equal to each other, it skips down to the label on line 18. If the values were equal, it continues on after line 11 to the next instruction at 14.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | .data
x: .word 2
y: .word 0
.text
_start:
LDR r1, =x @load x's address
LDR r1, [r1] @r1 = x
CMP r1, #2 @test r1 vs 2 (calculate r1 - 2)
BNE endIf @branch past "if body" if r1 Not Equal to 2
@These instructions only executed if r1 was == 2
MOV r2, #5
LDR r3, =y @load y's address
STR r2, [r3] @y = 5
endIf:
MOV r0, r0 @do nothing... rest of program here
|
Warning
Before using the comparison codes, you need to do a comparison to set the condition bits!