ARM Instruction
ARM goto Instruction
goto label (C) is the same as B label in ARM.
Conditional Branch
- Set the condition bits (N, Z, V, C) in the program status register.
- Then check on these condition bits to branch conditionally.
Conditional bits
N = 1 if result is Negative
Z = 1 if result is Zero
V = 1 if there’s overflow
C = 1 if there’s carry out
SUBS (with the ending S) sets conditional bits in cpsr register.
SUBS r1, r0, #0
r0 = r1 – #0, and set the condition bits NZVC based on the result.
If r1==r2, then N = 0, Z= 1, V = 0, C =1
If r < r2 (no overflow), then N =1, Z = 0, V=0
Another way to do that is to use a ‘Comparison Instruction’
CMP r1, r2 BEQ label @if Z = 1, then go to label
- Compare and set condition bits
- Subtract a register or an immediate value from a register value and updates status register
- Then check on these condition bits to branch conditionally
COM r0, #4 BEQ this_instr ADD r4, r5, r6 B end this_instr: SUB r0, r0, #1 end:
if(r0 == 4) r0 --; r4 = r5 + r6;
if(r0 != 4) r4 = r5 + r6; r0 --;
ARM Decision Instructions
BEQ label | == | BRANCH EQUAL |
BNE label | != | BRANCH NOT EQUAL |
BLE label | <= | BRANCH LESS THAN EQUAL |
BLT label | < | BRANCH LESS THAN |
BGE label | >= | BRANCH GREATER THAN EQUAL |
BGT label | > | BRANCH GREATER THAN |
The condition is T/F based upon the fields in the Program Status Register.
If…else
if (x==y) x += y; else x -= y;
CMP r01, r1 BNE else_aprt ADD r0, r0, r1 B end else_part: SUB r0, r0,r1 end:Published on October 23, 2015