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
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.
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)
You should checkout the ARM documentation at (example for CMP documentation): http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/CIHIDDID.html
From what can be read there what you are trying to do might require two instructions rather than just one (unless your ARM assembler does some special processing)
Kind regards,
Bo