Операнды операторов IF ELSE

#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. @Необычный да. Эти директивы являются директивами времени сборки. Они предназначены для условной сборки, а не для потока управления.