ARM Assembler - How do I use CMP, BLT and BGT?
arm, assembly, c, embedded
Solution
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)
Problem
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 ```