Keil arm Cortex - 查找中间数字3

问题描述 投票:0回答:2

假设我将3个数字值加载到三个不同的寄存器。我想找到中间数字。

AREA median, CODE, READONLY
    EXPORT main
first  EQU 3
middle EQU 3
last   EQU 9
    ENTRY

main 
     MOV R0, #first
     MOV R1, #middle
     MOV R2, #last
----------
Here i would like to compare these 3 values and find the middle number. (in this case, 3)

我试过像CMP R1, R2这样的东西,但是我无法在寄存器中存储我想要的值。这就是我试图找到两个中较小或较大的一个。

main:
        mov     r1, #3     /* setting up initial variable a */
        mov     r2, #9     /* setting up initial variable b */
        cmp     r1, r2     /* comparing variables to determine which is bigger */
        blt     r1_lower   /* jump to r1_lower in case r2 is bigger  */
        mov     r0, r1     /* if branching/jumping did not occur, r1 is bigger (or the same) so store r1 into r0 */
        b       end        /* proceed to the end */
r1_lower:
        mov r0, r2         /* end up here because r1 was smaller than r2, so move r2 into r0 */
        b end              /* proceed to the end */

有什么想法吗 ?

assembly keil cortex-m
2个回答
4
投票

具体而言,对于三个数字,有两种基本方法:

  • 您可以对三个数字进行排序,并从排序的数组中返回中间数字。为此,三级分拣网络通常是有用的。要构建这个,使用这个原语,如果r0大于r1,使用r0作为临时寄存器,交换r1r3cmp r0, r1 # if (r0 > r1) movgt r3, r1 # r2 = r1 movgt r1, r0 # r1 = r0 movgt r0, r3 # r0 = r1
  • 或者,您可以计算三个数字的最大值和最小值,并从它们的总和中减去它,得到中间的数字。例如,如果这三个数字在r0r1r2中,则可以通过以下方式完成: cmp r0, r1 # if (r0 > r1) movgt r3, r0 # then r3 = r0 (r3 is max) movgt r4, r1 # then r4 = r1 (r4 is min) movle r3, r1 # else r3 = r1 movle r4, r0 # else r4 = r0 cmp r2, r3 # if (r2 > r3) movgt r3, r2 # then r3 = r2 cmp r4, r2 # if (r4 > r2) movgt r4, r2 # then r4 = r2 add r5, r0, r1 # r5 = r0 + r1 (r5 is middle) add r5, r5, r2 # r5 = r5 + r2 sub r5, r5, r3 # r5 = r5 - r3 sub r5, r5, r4 # r5 = r5 - r5

0
投票

你遇到的确切问题是什么?您的CMP指令没问题,并将根据R0R1的相对值设置状态标志,因此您可以使用条件分支(例如BHIBGT)或IT系列指令之一来执行其他指令有条件地使用相同的条件代码。

有一个Thumb-2指令集的快速参考(大多数Cortex-M设备使用它,我假设你在没有任何其他信息的情况下使用它)here,还有更多关于条件分支的文档ARM信息中心站点上的条件执行,例如用于Cortex-M3的here

© www.soinside.com 2019 - 2024. All rights reserved.