Часть I. Процессор Cortex-M3. Программирование на ассемблере - 2 |
37 |
|
|
|
|
|
|
|
Рисунок 9. Ошибки при компиляции
Закомментируем строку, содержащую ошибку. Признаком комментария на языке ассемблер является точка с запятой. Но в ассемблере от IAR есть приятная особенность – он воспринимает комментарии языка С, т.е. мы можем использовать //. Устранив таким образом ошибку мы наконец-то достигаем желаемого результата, наш ассемблерный файл успешно компилируется.
Теперь нам осталось правильно организовать вызов нашей функции. Раскомментируем строки 2 и 6 в файле main.c, рис. 7, и снова запустим наш проект.
Сейчас ошибки выдаёт компоновщик или редактор связей (на программистском жаргоне «линкер», «линковщик») рис. 10. Он не видит ссылку func1_asm. Как нам известно, чтобы объявить ссылку видимой из внешних модулей, в языке С++ используется служебное слово public. Возможно, и в ассемблере есть нечто похожее? Проверим. Снова обращаемся к руководству Assembler Reference Guide. В приведенном примере есть строка:
EXTERN third
Здесь вместо служебного слова extern на ассемблере, поэтому логично предположить, что Используя поисковик, находим в руководстве фразу:
языке Си используется EXTERN на вместо public нужно искать PUBLIC.
For example, use the PUBLIC directive to make one or more symbols available to other modules.
Что для нас, собственно, и требуется.
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 2 |
38 |
|
|
|
|
|
|
|
Рисунок 10 Ошибки при компоновке
Дополняем наш файл func1_asm.asm строкой PUBLIC func1_asm
Запускаем проект и … Ура! Наконец-то у нас всё получилось.
Рисунок 11. Ассемблерный код
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 2 |
39 |
Вот наш первый шедевр на ассемблере, рис. 11. В том, что это действительно шедевр, не может быть никакого сомнения! Ведь мы умудрились написать нашу функцию на ассемблере, фактически не зная самого языка. Мы воспользовались дизассемблером и чутьчуть проявили сообразительность.
Пока мы не знаем команд, нам лишь известно, что эта функция делает – она складывает числа 2 и 5, и возвращает их сумму. Так ли это на самом деле, самое время проверить.
Запустите проект на отладку и на панели инструментов выберите View->Register. Должно открыться окно, где в оперативном режиме отслеживается содержимое регистров. С помощью мыши отрегулируйте размеры окон Disassembly и Register так, чтобы их одновременно было хорошо видно. У вас должна получиться картинка, как показано на рис.12. Если зелёная стрелка отсутствует в окне Disassembly, щёлкните мышью в этом окне, и она появится. Последовательно нажимая функциональную клавишу F11 или соответствующую кнопку на панели инструментов можно пошагово отследить исполнение нашей программы.
Положение курсора и синхронное изменение регистров однозначно информируют нас о назначении той или иной команды. Например, команда
ADDS R0,R1,R0
складывает содержимое регистра R1 с содержимым R0 и сохраняет результат в R0. Команда
MOVS R1,#2
загружает 2 в регистр R1 и т.д.
Функции func1_c() и func1_asm() вызываются из главной функции main() одна за другой, поэтому результат работы первой функции сохраняется в регистрах перед вызовом второй функции. По этой причине функцию func1_c() лучше закомментировать.
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 2 |
40 |
||
|
|
|
|
|
|
|
|
Рисунок 12 Дизассемблер IAR
Заметьте, что мы изучили функциональное назначение ассемблерных команд, не прибегая к чтению какой либо документации. В общем случае так поступать не удастся. Прежде чем вы овладеете профессиональными навыками программирования, придётся затратить много часов на чтение специальной литературы. Причём, почти вся она на английском языке, то, что есть на русском, как правило, уже устаревшее. Есть устоявшееся мнение, что в природе не существует программистов, не знающих английского языка. Чем раньше будет воспринят этот по-настоящему печальный природный факт – тем лучше.
К большому счастью студентов, не владеющих английским языком в должной степени, фирма "Миландр" поставляет документацию к своим контроллерам на русском языке. Поэтому на ближайший семестр эта документация станет основным учебником по ассемблеру, точнее, по системе команд для линейки микроконтроллеров этой фирмы. Синтаксис ассемблера придётся осваивать в основном по справочнику Assembler Reference Guide. Здесь без знания английского уже никак не обойтись.
Ещё раз взгляните на рис. 12. На нём вы видите самого хорошего учителя по ассемблеру, его имя Дизассемблер, это любимый друг хакеров. Он очень квалифицирован, терпелив, не раздражителен, никогда не устаёт. Многие поколения программистов трудились над его появлением на свет. Мы надеемся, что вы с ним подружитесь. Но, как и любой учитель, он предъявляет к своим ученикам требования: некоторую сообразительность и регулярность в занятиях. Неуважительного отношения к себе он, увы, не прощает, особенно
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 2 |
41 |
во время сессии.
2.3Указания к выполнению лабораторной работы №1
Итак, подведём некоторый итог. Мы попытались подробно описать алгоритм работы программиста. Рекомендуем пошагово повторить все действия. Появление ошибок при разработке программ это совершенно нормальная (штатная) ситуация. Диагностическое сообщение, как правило, даёт исчерпывающую информацию для исправления ошибки. И, самое главное, имеющихся знаний тоже, как правило, оказывается вполне достаточно. Очень важно в такой ситуации просто не растеряться. Хороший специалист как раз и вырастает из множества маленьких побед … над собой.
1.Вам необходимо придумать какую-нибудь свою простую функцию и написать её сначала на Си.
2.Затем, используя дизассемблер, написать её аналог на ассемблере.
3.Обратившись к документации по микроконтроллерам "Миландр" снабдить комментариями каждую команду.
На кафедральном сервере по адресу \_For_Students\MPSSAU\_Nediak\Arch (TODO переместить в !Labs) есть образцы лабораторных работ, выполненных по предлагаемому алгоритму. Ознакомиться можно, копировать и потом пытаться сдавать не стоит. Используя творческий подход, попытайтесь самостоятельно разобраться, как происходит обмен информацией между вызывающей и вызываемой функцией, в частности, как передаются параметры в функцию и как затем возвращается результат вычислений.
1.Описание последовательности действий для создания проекта, ошибочных действий в том числе.
2.Исходный текст функции main().
3.Исходный текст простейшего модуля (функции) на языке Си.
4.Исходный текст его аналога на Assembler-e.
5.Заключение по лабораторной работе.
6.Отчет вместе с проектом разместить Redmine.
Замечание. Исходный текст на Assembler-e должен быть снабжен подробными комментариями в каждой строке. Также он должен быть уникален, т.е. разработан самостоятельно, а не переписан у одногруппника.
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |