В системе команд ARM все "обычные" и изрядная часть прочих инструкций имеют возможность условного выполнения. Однако в системе команд Thumb -- а только она имеется в любых процессорах М-профиля (т.е. в ядрах серии Cortex-M) -- нет никаких условно выполняемых команд, кроме переходов Bxx. Поэтому, чтобы обеспечить-таки возможность условного выполнения коротких последовательностей команд (до четырёх), в Thumb-2 была введена специальная инструкция IT. В просто Thumb (это все старые процессоры, кроме архитектуры ARMv6T2, а также ядро Cortex-M0) этой инструкции нет, поэтому условное выполнение команд там невозможно (за исключением уже упоминавшихся условных переходов).
В принципе, транслятор ассемблера мог бы разобраться и вставить IT сам, видя, что указаны суффиксы условий. Но, во-первых, это может быть не реализовано в конкретном трансляторе, во-вторых, явно показывает, что там имеется отдельная инструкция (а следовательно, под неё выделяется память), ну а в-третьих, позволяет дополнительно убедиться в правильности условий в последующих командах, а также точно определить границу IT-блока, поскольку инструкция IT задаёт ещё и число условных операций за ней (например, ITTEE указывает, что будет 4 инструкции: сначала две с прямым условием, а затем две с обратным).
Правильно ли я понял, что в случае Cortex-M процессоров, в инструкциях, составляющих тело IT-блока, суффиксы можно писать, а можно не писать, эффект будет одинаковый?
Зависит от транслятора: если по-хорошему, он должен бы ругнуться на отсутствие условий у инструкций, попадающих в IT-блок (а вдруг программист ошибся и либо неверно написал IT, либо пропустил условно выполняемую команду?).
Значит это всё из-за особенностей Кортексов. А суффиксы пишут для совместимости с разными ассемблерами. Вот теперь всё понятно! Благодарю за обстоятельное разъяснение!
"Кортексы" поминают постоянно, но, строго говоря, это некорректно. Cortex -- это общее название группы процессорных ядер, но они могут сильно различаться между собой. Есть ядра для "обычных" микроконтроллеров -- так называемый M-профиль. Они соответствуют версиям архитектуры ARMv6-M (Cortex-M0) и разным вариантам ARMv7-M (другие ядра Cortex-M). Есть ядра для высокопроизводительных и особо надёжных (ну, так декларировано) микроконтроллеров -- R-профиль (серия Cortex-R), соответствующая версии архитектуры ARMv7-R. Наконец, есть ядра, предназначенные для микропроцессоров, а не микроконтроллеров -- A-профиль (Cortex-A), соответствующий версии ARMv7-A. Так вот, версии ARMv7-R и ARMv7-A, т.е. серии ядер Cortex-R и Cortex-A, являются "истинными" ARMами, имеющими и систему команд ARM, и систему команд Thumb; именно они совместимы снизу вверх со всеми предыдущими версиями (кроме ARMv6-M). Ну а M-профиль -- это уже как бы и не настоящий ARM, поскольку ARMовская система команд у него отсутствует; кроме того, кардинально отличается системная архитектура (обработка прерываний и т.д.). Вот по этой причине поминать "Кортексы" обычно технически некорректно -- в Вашем конкретном случае Вы хотели сказать о М-профиле архитектуры, например, а не о всех современных ядрах от ARM (куда, кстати, входят и 64-разрядные процессоры архитектуры ARMv8).
Кстати говоря, из-за параллельного существования версий архитектуры и названий ядер путаница возникала и раньше. Например, очень популярное ядро ARM7TDMI-S соответствует архитектуре ARMv4T, но ей же соответствует ещё несколько ядер, обозначений коих я не помню.
Разница между версией архитектуры (ARMv4T или ARMv7-M, например) и названием ядра (скажем, ARM7TDMI-S и Cortex-M3) заключается в том, что версия архитектуры может быть общей для многих ядер; она показывает, как ядро выглядит с точки зрения программиста (какие есть регистры, какие команды доступны и т.д. т.п.). Имя же ядра обозначает конкретную реализацию "в железе" (ну или на языке описания аппаратуры -- ARMы сделаны на Verilog, например) той или иной архитектуры. Одна и та же архитектура может быть реализована разными способами, отличающимися сложностью и производительностью, но выглядящими одинаково с точки зрения программиста. Особенно хорошо это заметно на персоналках, где используются процессоры архитектуры IA-32 (это её официальное название; x86 -- принятое в народе обозначение), но и в случае с ARMами имеем, вообще говоря, то же самое.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения