Часть I. Процессор Cortex-M3. Программирование на ассемблере - 4 |
52 |
Рисунок 21. Дизассемблирование inverseC_DxDxD( )
Мы ещё вернёмся к более подробному анализу этого кода, а пока лишь отметим, что он получился достаточно громоздким. Из курса изучения языка Си нам известно, что любой многомерный массив представляется в памяти компьютера (микроконтроллера) как одномерный с таким же числом элементов. Поэтому мы несколько модернизируем нашу функцию с целью сокращения размера машинного кода.
Чтобы получить зачёт по данной лабораторной, достаточно перевести на ассемблер и
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 4 |
53 |
этот громоздкий код. Но ещё раз напомним, в каких случаях используют ассемблер. Его используют тогда, когда хотят получить максимально эффективный код. Мы попытаемся это сделать.
Вместо функции inverseC_DxDxD(), инвертирующей 3-х мерный массив, мы напишем функцию inverseC_1(), инвертирующую одномерный.
Рисунок 22. inverseC_1( )
Такой исходный код на Си, рис. 22, даёт следующий дизассемблированный код, рис. 23.
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 4 |
54 |
Рисунок 23. Дизассемблирование inverseC_1( )
Размер кода на Си сократился несущественно, всего на 3 строчки, а вот ассемблерный код и соответственно машинный код сократились вполне ощутимо и, следовательно, этот вариант Си-кода более достоин перевода на язык ассемблера.
Сохраним этот фрагмент дизассемблированного кода в отдельном файле с именем inverseASM_1.s и удалим из него лишнее. К тому же добавим необходимые строки из файласкелета ассемблерной функции. Результатом нашей работы будет исходный код функции inverseASM_1( ); на ассемблере, рисунок 24.
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 4 |
55 |
Рисунок 24. Функция (процедура) inverseASM_1
Включаем нашу функцию в проект, компилируем и тестируем её. Всё — лабораторная готова. Пишем отчёт и можно предъявлять работу для сдачи.
Но на всякий случай ещё раз читаем задание «...задан трёхмерный массив...». А трёхмерный массив чего? В качестве элементов массива могут быть целые, символьные, числа с плавающей точкой, структуры, наконец — т.е. любые элементы, допустимые в языке Си. У нас есть два пути: либо уточнить у преподавателя задание, либо написать функцию, которая будет работать в любом случае.
Попробуем написать такую универсальную функцию. Заметим, что для того, чтобы решить поставленную задачу, совершенно не обязательно знать, какого типа данные располагаются в массиве. Достаточно знать только адрес начала массива и его размер в байтах. Отсюда следует, что функция инвертирования будет универсальной, если она будет выполнять это действие побайтно. Реализовываем наши идеи сначала на языке Си, рисунок 25.
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 4 |
56 |
Рисунок 25. Исходный код на Си
а затем и на ассемблере. Наша универсальная функция будет называться inverseASM и мы её добавим в тот же исходный файл inverseASM_1.s, рисунок 26.
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |