При сравнении чисел в ARM Assembly есть верный способ сохранить значение - PullRequest
0 голосов
/ 17 января 2019

поэтому я делаю некоторый код, который может прочитать список чисел, разделить его на блоки по 3 и решить, какое из этих 3 чисел является наибольшим.Затем я собираюсь взять самые большие значения из каждого блока в 3 и сложить их все вместе.

Для этого я храню свои значения в нескольких регистрах:

 MOV r1,#0 ;loop counter
 MOV r2,#0 ;compare store 1
 MOV r3,#0 ;compare store 2
 MOV r4,#0 ;compare store 3
 MOV r5,#0 ;sum of values
 MOV r6,#0 ;which was greater in value
 LDR r8,=data_values ;the list of values

Я использую команду CMP для сравнения значений, однако я не совсем уверен, верен ли мой метод для хранения и добавления значений.На данный момент у меня есть это:

MOV r6,CMP r2,r3 ;Moving the comparison value into r6, my store for the greater value
MOV r6,CMP r6,r4 ;Comparing the larger value to the 3rd value
ADD r5,r5,r6 ;Adding the larger value to the sum

Это выглядит совместимым с другими функциями, которые работали для меня раньше, но я продолжаю получать эти ошибки:

task3.s (26): предупреждение: A1865W: «#» не видно перед константным выражением

и

task3.s (26): ошибка: A1137E: неожиданные символы в концеline

Теперь я почти уверен, что это не константа, если константа не определена здесь по-другому, и в конце строки нет дополнительных символов, если она не считает все сравнениефункционируют как дополнительные символы

Image showing the whole line highlighted with no extra characters sitting at the end

Есть ли что-то, что я должен изменить, или он должен работать нормально, и эти предупреждения игнорируются?

Спасибовы

1 Ответ

0 голосов
/ 17 января 2019

Если вы хотите вычислить максимум двух чисел, стандартный подход в сборке ARM выглядит примерно так:

cmp   r0, r1  @ if r0 > r1
movgt r2, r0  @ then r2 = r0
movle r2, r1  @ else r2 = r1

Чтобы добавить максимум r0, r1 и r2 to r3 вы можете захотеть что-то вроде этого:

cmp   r0, r1      @ if r0 < r1
movlt r0, r1      @ then r0 = r1 (i.e. r0 = max(r0, r1))
cmp   r0, r2      @ if r0 < r2
movlt r0, r2      @ then r0 = r2 (i.e. r0 = max(max(r0, r1), r2))
add   r3, r0, r3  @ r3 += r0

реализация этого таким образом, что вы не заглушаете какие-либо регистры, оставлена ​​читателю в качестве упражнения.

Всегда держите вИмейте в виду, что почти каждая инструкция может быть выполнена условно на ARM.В этом вся сила набора инструкций.

...