Конструкция IF-ELSE в ассемблере для stm32

Общие вопросы функционирования и программирования МК, обсуждение типовых алгоритмов...
Ответить
alpha-alnair
Читатель
Читатель
Сообщения: 4
Зарегистрирован: 25 окт 2020, 20:25
Откуда: Нижний Новгород

Конструкция IF-ELSE в ассемблере для stm32

Сообщение alpha-alnair »

Добрый день, уважаемые участники форума!
Кто-нибудь пробовал применять конструкцию IF-ELSE в программах на Ассемблере для МК stm32?
Задача сравнить содержимое двух регистров.

Имею такой код:
mov r1, #0xAA
mov r2, #0xAA
IF r1 == r2
;Набор инструкций
ELSE
;Набор инструкций
ENDIF

Проблема в том, при равенстве значений в r0 и r1 программа всегда переходит блок ELSE.

Пробовал даже делать так:
К примеру имеются некие заранее объявленные переменные hi и lo

AREA RAM, NOINIT, READWRITE
hi DCDU 0
lo DCDU 0

AREA Program, CODE, READONLY
...
mov r1, #0xAA
ldr r0, =hi
str r0, [r1]

;Для переменной lo то же, самое

IF r1 == r2
;Набор инструкций
ELSE
;Набор инструкций
ENDIF

Результат тот же, что и в первом случае

С директивами GBLL и SETL вообще ни чего не понятно. Компилятор ругается на неверный тип данных. Перепробовал кучу комбинаций. И, сказать по правде, складывается такое мнение, что конструкция IF..., в данном контексте, предусмотрена вообще не для этого.
Если код, написанный на ассемблере, прочитать задом на перёд, то можно вызвать дьявола.
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3001
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Конструкция IF-ELSE в ассемблере для stm32

Сообщение rhf-admin »

IF r1 == r2
при равенстве значений в r0 и r1
В первом случае r1 и r2, а во втором r0 и r1. Не в этом ли проблема?

И почему вообще IF ELSE, а не cmp beq? Уж ассемблер, так ассемблер.
С уважением, администрация сайта.
alpha-alnair
Читатель
Читатель
Сообщения: 4
Зарегистрирован: 25 окт 2020, 20:25
Откуда: Нижний Новгород

Re: Конструкция IF-ELSE в ассемблере для stm32

Сообщение alpha-alnair »

Прошу пардона! )
Во втором случае опечатка!
Там должно быть так:

mov r1, 0xAA
ldr r0, =hi
str r1, [r0]
...
IF hi == lo
...

Во втором случае я показал, что двумя командами загружаю содержимое r1 в переменную hi, и ни какого r0 в операции сравнения там, конечно же, не должно быть. :)
r0, всего лишь, участвует в операции с адресом переменной "hi".
Для переменной "lo" я расписывать не стал, выглядит это подобны же образом.

На счёт - "Уж ассемблер, так ассемблер"... - Всё верно! )
Просто хотел испытать данную языковую конструкцию, а тут вон оказывается чего!?...

Проблема состоит, скорее всего, в том что конструкция IF... в armasm не работает для сравнения двух регистров, но по сведениям из литературы, работает для сравнения регистра с непосредственно заданным числом (imm). Других примеров не видел.

Кстати, если значения в двух сравниваемых регистрах не равны, и написать что-нибудь вроде этого:
...
IF r0 <> r1
...

то в данном случае код отработает как положено. )
Для других операторов эксперимент не проводил.
Если код, написанный на ассемблере, прочитать задом на перёд, то можно вызвать дьявола.
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3001
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Конструкция IF-ELSE в ассемблере для stm32

Сообщение rhf-admin »

складывается такое мнение, что конструкция IF..., в данном контексте, предусмотрена вообще не для этого.
скорее всего, в том что конструкция IF... в armasm не работает для сравнения двух регистров
Блин, давно ассемблером под армы не баловался, посмотрел ещё раз - дошло. IF THEN - это же не команды ассемблера (не исполняемый код), а директивы. Эти директивы не предназначена для сравнения значений в регистрах, они проверяются один раз при компиляции. Их можно использовать чтобы программу в разных случаях по разному компилировать (например, для разных чипов по разному). Директивы не могут понять какие значения окажутся в регистрах при выполнении программы (они там в общем случае разные могут оказаться).

Подробно про эти и другие директивы можно почитать в главе Directives Reference документа Assembler User Guide, который можно найти в Keil uVision 5 по следующему пути: вкладка Books менеджера проектов -> Tools User’s Guide -> Complete User’s Guide Selection -> Assembler User Guide.

Короче, главное резюме - IF THEN - это не исполняемый код!!! Это не часть программы, которая будет выполняться в контроллере, а директивы, указывающие компилятору какой кусок включить в программу в данном конкретном случае компиляции.
С уважением, администрация сайта.
Ответить