Keil arm Cortex - 找到 3 的中间数

Keil arm Cortex - Find middle number of 3

假设我将 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 */

有什么想法吗?

您遇到的具体问题是什么?您的 CMP 指令很好,并且会根据 R0R1 的相对值设置状态标志,因此您可以使用条件分支(例如 BHIBGT) 或 IT 指令家族之一,允许您使用相同的条件代码有条件地执行其他指令。

有 Thumb-2 指令集的快速参考(大多数 Cortex-M 设备都使用它,在没有任何其他信息的情况下我假设您正在使用它)here, and there's plenty more documentation on conditional branching and conditional execution on the ARM Infocenter site, for example here对于 Cortex-M3。

具体三个数字,有两种基本方法:

  • 您可以对三个数字进行排序,return 排序后的数组中的中间数字。为此,三级排序网络通常很有用。要构建它,请使用此原语,如果 r0 大于 r1,则交换 r0r1,使用 r3 作为临时寄存器:

    cmp   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