ARM Assembler - How do I use CMP, BLT and BGT?
Solution 1
You cannot do a conditional branch without first setting the condition register somehow. This can be done with cmp
or by adding s
to most instructions. Check out the ARM assembly documentation for details. Quick example:
Branch if r0
greater than 5:
cmp r0, #5 ;Performs r0-5 and sets condition register
bgt label_foo ;Branches to label_foo if condition register is set to GT
Compare r6
with r4
, put difference into r7
, branch if r7 < 0
:
subs r7, r6, r4 ;Performs r7 = r6 - r4 and sets condition register
blt label_bar ;Branches to label_bar if r7 < 0 (in which case r6 < r4)
Solution 2
If I wanted to use CMP to compare r6, with r4 and put the difference into r7, how would I do this?
subs r7, r6, r4 /* r7 ← r6 - r4 */
The same question if I wanted to use BLT if r7 is less than 0, how would I do this?
bmi _exit /* branch if r7 < 0 */
BMI (minus/negative) When N is enabled (N is 1) where N is a flag that will be enabled if the result of the instruction yields a negative number. Disabled otherwise.
Why subS instead of sub? Because S is an optional suffix that when is specified, the condition flags (like N) are updated on the result of the operation.
Regards.
user1080390
Updated on July 09, 2022Comments
-
user1080390 almost 2 years
Quick question for you guys, in my loop I need to use CMP , BLT and BGT to compare some values. How would use said instructions in the following loop?
I'm trying to use BGT , BLT and CMP as I need them to make my application work. The trouble is I have no idea how to use them. If I wanted to use CMP to compare r6, with r4 and put the difference into r7, how would I do this? The same question if I wanted to use BLT if r7 is less than 0, how would I do this?
BGT ??????? ; branch if greater than 5 CMP ???????? ; compare r6 with r4 , put difference into r7 BLT ???????? ;branch if r7 is less than 0 BGT ???????? ;branch if r7 is greater than 0
Here's my entire loop:
LoopStart BL WaitBUT1 BL readTemp BL checkTemp BGT ??????? ; branch if greater than 5 BL errorVal CMP ???????? ; compare r6 with r4 , put difference into r7 BLT ???????? ;branch if r7 is less than 0 BL FanOn BL errorLedOn BL systemLedOn BL heaterOn BGT ???????? ;branch if r7 is greater than 0 BL FanOff BL errorLedOff BL systemLedOff BL heaterOff BL WaitBUT2 BL FanOff BL errorLedOff BL systemLedOff BL heaterOff B LoopStart