#assembly #arm #keil #thumb
#сборка #arm #keil #большой палец
Вопрос:
У меня есть очень простое IF ELIF ELSE ENDIF
утверждение, чтобы проверить, сравнивается ли значение в r0 с другими значениями. Код всегда выдает следующие ошибки при сборке:
main.s(25): error: A1198E: Unknown operand
main.s(27): error: A1198E: Unknown operand
Я считаю, что проблема связана с, возможно =
, <=
, и >=
на самом деле не являются операндами, которые могут функционировать в IF
операторах, но на основе документации на их веб-сайте, =
должны работать. Код выглядит следующим образом:
AREA |.text|, CODE, READONLY, ALIGN=2
THUMB
EXPORT Start
NEWVERSION dcw 2
Start
mov r1, #21
bl Price
loop B loop
Price
IF {[r1]! <= #13}
mov r0, #6
ELIF {[r1]! >= #65}
mov r0, #7
ELSE
mov r0, #8
ENDIF
ALIGN ; make sure the end of this section is aligned
END ; end of file
Я знаю, что у меня регистры сравниваются с литералами, но код выдает эту ошибку при [r0]!
замене некоторым непосредственным значением, таким как #12
. Похоже, не так много информации о том, как использовать IF ELSE
инструкции в Thumb, и я почти начинаю сомневаться, есть ли скрытая причина, почему это может быть так, поскольку большинство примеров просто переходят к подпрограммам кода или используют инструкцию IT.
Ответ №1:
Согласно документации:
Используйте
IF
сENDIF
и, необязательно, сELSE
для последовательностей инструкций или директив, которые должны быть собраны или обработаны только при определенных условиях.
Это не логические операторы, которые управляют потоком вашей программы, а являются директивами ассемблеру для включения или исключения кода в зависимости, например, от сборки для конкретных архитектур.
Если вы знакомы с C
, эти инструкции похожи #ifdef
на директивы препроцессора, а не if()
на инструкции потока программы.
Комментарии:
1. Значит, эти операторы в основном имеют ценность, только если вы знаете результат в момент выполнения?
2. Директивы обрабатываются в момент выполнения
thumb main.s
,IF
и в зависимости от результата вычисления выражения код вIF..ENDIF
блоке либо записывается, либо не записывается в выходнойmain.o
файл.3. @Необычный да. Эти директивы являются директивами времени сборки. Они предназначены для условной сборки, а не для потока управления.