AzardCry 0 15 апреля, 2022 Опубликовано 15 апреля, 2022 · Жалоба Доброго времени! При программировании на ассемблере возникло две сложности, которые самому не удалось решить, прошу подсказать: 1. В документации на МК (1986ВЕ4У) есть используемая в нём система команд THUMB и список всех команд, которые используются, в том числе команда AND. При работе в Keil использование выражения "AND Rx, #0xXXXXXXXX" компилятор сообщает, что такая команда в наборе команд THUMB (указанным мной в начале файла) не существует (error: A1618E: Specified instruction is not supported by the current instruction set). Для справки, данной командой отчищаю часть регистра. Замена на ANDS не выручает. При этом ORRS работает. 2. Команда POP {LR} также не работает со следующей ошибкой (error: A1875E: Register Rn must be from R0 to R7 in this instruction). Я так понимаю у меня соответствующий регистр 16-битный и мне придётся всё же использовать дополнительный регистр для копирования туда значения LR перед заходом в процедуру (так как в LR на данном этапе будет помещён другой адрес возврата)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 15 апреля, 2022 Опубликовано 15 апреля, 2022 · Жалоба 51 минуту назад, AzardCry сказал: 1. В документации на МК (1986ВЕ4У) есть используемая в нём система команд THUMB и список всех команд, которые используются, в том числе команда AND. При работе в Keil использование выражения "AND Rx, #0xXXXXXXXX" компилятор сообщает, что такая команда в наборе команд THUMB (указанным мной в начале файла) не существует (error: A1618E: Specified instruction is not supported by the current instruction set). Для справки, данной командой отчищаю часть регистра. Вроде как 1986ВЕ - это Cortex-M0? А значит там никак не может быть команды AND. Да ещё с непосредственным значением. А только ANDS с регистром. Цитата Замена на ANDS не выручает. При этом ORRS работает. Это как это? Вообще-то для очистки части битов предназначена команда BICS. Цитата 2. Команда POP {LR} также не работает со следующей ошибкой (error: A1875E: Register Rn must be from R0 to R7 in this instruction). Если б Вы открыли описание на систему команд Cortex-M0, то прочитали бы: POP Pop Multiple Registers loads a subset, or possibly all, of the general-purpose registers R0-R7 and the PC from the stack. т.е. - LR в ней не может быть никак. Цитата Я так понимаю у меня соответствующий регистр 16-битный и мне придётся всё же использовать дополнительный регистр для копирования туда значения LR перед заходом в процедуру (так как в LR на данном этапе будет помещён другой адрес возврата)? У Вас вообще сплошная каша в голове... Во-первых: LR не 16-битный, а как и все прочие - 32-битный. Во-вторых: при входе в процедуру, значение в LR копируется из PC автоматически. Именно этим вызов процедуры и отличается от простого перехода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SII 0 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба Если речь про использование ассемблера, то надо изучать не документацию на конкретный МК, а документацию на архитектуру -- ARMv7-M для большинства ныне используемых ядер MK (Cortex-M3, M4, M7), ARMv6-M в случае -M0 и -M1, ARMv8-M в случае более новых ядер (-M23, M33; может, ещё что есть). Насчёт констант надо помнить, что система команд не позволяет представить любые константы прямо в команде (константа, вообще говоря, 32 бита, а код команды -- либо 16, либо 32 бита, поэтому и нельзя произвольную константу закодировать прямо в команде). В документации на архитектуру описано, как константа формируется из тех битов, что присутствуют в коде команды. Всё остальное надо представлять данными в памяти, загружаемыми командой LDR (для чего есть даже специальный синтаксис -- LDR Rn, =значение), либо собирать из двух половинок двумя командами MOVT и MOVW (но они отсутствуют в ARMv6-M и в тех ARMv8-M, которые не имеют "основного расширения", т.е. логически являются развитием ARMv6-M, а не ARMv7-M). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться