Keil arm Cortex - Найти среднее число 3 - PullRequest
0 голосов
/ 18 марта 2019

Допустим, я загружаю 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 */

Есть мысли?

Ответы [ 2 ]

4 голосов
/ 18 марта 2019

Специально для трех чисел существует два основных подхода:

  • . Вы можете отсортировать три числа и вернуть среднее число из отсортированного массива.Для этого, как правило, полезна трехступенчатая сортировочная сеть.Чтобы построить это, используйте этот примитив, который меняет 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
    
0 голосов
/ 18 марта 2019

С какой именно проблемой вы столкнулись? Ваша инструкция CMP в порядке и устанавливает флаги состояния в зависимости от относительных значений R0 и R1, поэтому вы можете использовать условную ветвь (например, BHI или BGT) или один из IT семейство инструкций, которые позволят вам выполнять другие инструкции условно, используя те же коды условий.

Существует краткий справочник по набору команд Thumb-2 (который используется большинством устройств Cortex-M, который, как я полагаю, вы используете в отсутствие какой-либо другой информации) здесь и есть еще много документации по условному ветвлению и условному выполнению на сайте Инфоцентра ARM, например здесь для Cortex-M3.

...