Добрый день, уважаемые участники форума!
Кто-нибудь пробовал применять конструкцию 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..., в данном контексте, предусмотрена вообще не для этого.
Конструкция IF-ELSE в ассемблере для stm32
-
- Читатель
- Сообщения: 4
- Зарегистрирован: 25 окт 2020, 20:25
- Откуда: Нижний Новгород
Конструкция IF-ELSE в ассемблере для stm32
Если код, написанный на ассемблере, прочитать задом на перёд, то можно вызвать дьявола.
- rhf-admin
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
Re: Конструкция IF-ELSE в ассемблере для stm32
IF r1 == r2
В первом случае r1 и r2, а во втором r0 и r1. Не в этом ли проблема?при равенстве значений в r0 и r1
И почему вообще IF ELSE, а не cmp beq? Уж ассемблер, так ассемблер.
С уважением, администрация сайта.
-
- Читатель
- Сообщения: 4
- Зарегистрирован: 25 окт 2020, 20:25
- Откуда: Нижний Новгород
Re: Конструкция IF-ELSE в ассемблере для stm32
Прошу пардона! )
Во втором случае опечатка!
Там должно быть так:
mov r1, 0xAA
ldr r0, =hi
str r1, [r0]
...
IF hi == lo
...
Во втором случае я показал, что двумя командами загружаю содержимое r1 в переменную hi, и ни какого r0 в операции сравнения там, конечно же, не должно быть.
r0, всего лишь, участвует в операции с адресом переменной "hi".
Для переменной "lo" я расписывать не стал, выглядит это подобны же образом.
На счёт - "Уж ассемблер, так ассемблер"... - Всё верно! )
Просто хотел испытать данную языковую конструкцию, а тут вон оказывается чего!?...
Проблема состоит, скорее всего, в том что конструкция IF... в armasm не работает для сравнения двух регистров, но по сведениям из литературы, работает для сравнения регистра с непосредственно заданным числом (imm). Других примеров не видел.
Кстати, если значения в двух сравниваемых регистрах не равны, и написать что-нибудь вроде этого:
...
IF r0 <> r1
...
то в данном случае код отработает как положено. )
Для других операторов эксперимент не проводил.
Во втором случае опечатка!
Там должно быть так:
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
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
Re: Конструкция IF-ELSE в ассемблере для stm32
складывается такое мнение, что конструкция IF..., в данном контексте, предусмотрена вообще не для этого.
Блин, давно ассемблером под армы не баловался, посмотрел ещё раз - дошло. IF THEN - это же не команды ассемблера (не исполняемый код), а директивы. Эти директивы не предназначена для сравнения значений в регистрах, они проверяются один раз при компиляции. Их можно использовать чтобы программу в разных случаях по разному компилировать (например, для разных чипов по разному). Директивы не могут понять какие значения окажутся в регистрах при выполнении программы (они там в общем случае разные могут оказаться).скорее всего, в том что конструкция IF... в armasm не работает для сравнения двух регистров
Подробно про эти и другие директивы можно почитать в главе Directives Reference документа Assembler User Guide, который можно найти в Keil uVision 5 по следующему пути: вкладка Books менеджера проектов -> Tools User’s Guide -> Complete User’s Guide Selection -> Assembler User Guide.
Короче, главное резюме - IF THEN - это не исполняемый код!!! Это не часть программы, которая будет выполняться в контроллере, а директивы, указывающие компилятору какой кусок включить в программу в данном конкретном случае компиляции.
С уважением, администрация сайта.