Материал: 6798

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Часть 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 г.

Источник: https://studfile.net/preview/16438538/