ARM Assembler - How do I use CMP, BLT and BGT?

前端 未结 3 587
北荒
北荒 2021-02-09 12:29

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

相关标签:
3条回答
  • 2021-02-09 12:38

    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.

    0 讨论(0)
  • 2021-02-09 12:43

    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)
    
    0 讨论(0)
  • 2021-02-09 12:58

    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

    0 讨论(0)
提交回复
热议问题