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
指令很好,并且会根据 R0
和 R1
的相对值设置状态标志,因此您可以使用条件分支(例如 BHI
或BGT
) 或 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
,则交换 r0
和 r1
,使用 r3
作为临时寄存器:
cmp r0, r1 # if (r0 > r1)
movgt r3, r1 # r2 = r1
movgt r1, r0 # r1 = r0
movgt r0, r3 # r0 = r1
或者,您可以计算三个数字的最大值和最小值,然后从它们的总和中减去它,得到中间的数字。例如,如果三个数字在r0
、r1
和r2
中,则可以通过:
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
假设我将 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
指令很好,并且会根据 R0
和 R1
的相对值设置状态标志,因此您可以使用条件分支(例如 BHI
或BGT
) 或 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
,则交换r0
和r1
,使用r3
作为临时寄存器:cmp r0, r1 # if (r0 > r1) movgt r3, r1 # r2 = r1 movgt r1, r0 # r1 = r0 movgt r0, r3 # r0 = r1
或者,您可以计算三个数字的最大值和最小值,然后从它们的总和中减去它,得到中间的数字。例如,如果三个数字在
r0
、r1
和r2
中,则可以通过: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