Мысловский Э.В. Цифровые сигнальные процесссоры (2003) (1264219), страница 7
Текст из файла (страница 7)
В языке ассемблера идентификатор - этопоследовательность из латинских букв, цифр и следующих знаков: “_”, “-”. Различаютсяидентификаторы длиной до 32 символов. Кроме того, идентификаторы являютсязависимыми от регистра, то есть идентификатор WORD и идентификатор word различны.Запрещено начинать идентификаторы с цифры.Зарезервированы следующие идентификаторы:413.5.3 Форматы представления данныхВ языке ассемблера ADSP-218x имеются средства для записи целых чисел вдвоичной, десятичной, восьмеричной и шестнадцатеричной системах счисления.Десятичныечислазаписываютсябезспецификаторов,шестнадцатеричные-спрефиксным спецификатором 0х (нуль и х) или Н#, восьмеричные - с префикснымспецификатором 0(нуль), двоичные - с префиксным спецификатором В#.Пример:Определение различных чисел языка ассемблера ADSP-218хДесятичные•12•+67•-89Восьмеричные•066•+077•-05442Внимание - не используйте префикса 0 для десятичных чисел, поскольку,например 044<>44Шестнадцатеричные•OxOFl•0хА2•H#1BДвоичные•В#011•В#10010013.5.4 Арифметические и логические операторы языка ассемблераЯзык ассемблера поддерживает арифметические и логические выражения.Существуют две разновидности выражений:•Арифметические или логические операции с двумя или более целымиконстантами (25 + 14, (15 — 4)*4, OXff & Н#12)•Операция плюс или минус числовая константа (flag + 1, data - 6)Операторы языка ассемблера схожи с операторами языка С.•+,- - сложение, разность•*,/ - умножение, деление•% - деление по модулю•«,»- двоичный сдвиг влево и вправо•& - логическое И (AND)•| - логическое ИЛИ (OR)•^ - логическое ИСКЛЮЧАЮЩЕЕ-ИЛИ (XOR)•LENGTH(symbol) - размер symbol•ADDRESS (symbol) — начальный 16-разрядный адрес symbol•symbol - адрес symbol•PAGE(symbol) - значение старших 8 бит адреса symbolАдрес буфера и операторы определения длиныЯзыкассемблераподдерживаетдваспециальныхопределения адреса ^ и оператор определения длины %.43оператора.Оператор^bufer - Возвращает адрес буфера%bufer - Возвращает размер буфераПример:Пример работы с буффером .VAR buf[3] – 1,2,3;I0 = ^buf; /* в 10 заносится адрес buf */L0 = %buf /*в L0 заносится размер буфера, то есть - 3 */Сложением и вычитанием констант могут быть образованны простые выражения^bufer + constant^bufer - constant%bufer + constant%bufer - constantПример: Пример адресной арифметики^buf + 3%buf - 1Смысл подобных выражений следующий: в случае оператора адреса - мымодифицируем этот адрес, а в случае оператора определения длины - изменяем длину.
Нерекомендуется использовать увеличение длины, гак как это может привести к корреляцииданных, что, в свою очередь, приводит к трудноопределимым ошибкам.3.5.6 КомментарииВы можете вставлять комментарии в любом месте исходного текста, заключив ихв скобки {}, за исключением строк директив С препроцессора. Применение вложенныхкомментариев не разрешено. Чтобы использовать комментарии в строках содержащихдирективы С препроцессора (начинающиеся с символа #) используйте правила С#директива /* комментарий */443.5.7 Директивы препроцессора САссемблер ASM-21xx включает С препроцессор, который позволяет использоватьдирективы, указанные в таблицеТаблица 3.2 Директивы препроцессораДирективаЗначение#includeВставить текст из другого исходного файла#defmeМакроопределение.
Позволяет определять различныемакросы, например #define add AR = АХО + AY0#undefОтмена макроса, например, после директивы #undef addмакрос add перестаёт существовать#ifДиректива условного ассемблирования, условие задаетсянекоторой константой#ifdefДиректива условного ассемблирования, условие задаетсяналичием выбранного макроопределения#ifndefДиректива условного ассемблирования, условие задаетсяотсутствием выбранного макроопределения#elseВключение текста по альтернативной ветке дирректив #if ,#ifdef, #ifndef#endifЗавершения включения условного текста3.6 Директивы языка ассемблераДирективыассемблерауправляютпроцессомассемблирования.Ониобрабатываются препроцессором, но в отличие от инструкций не генерируют приассемблировании код.
Директива ассемблера начинается с точки и заканчивается точкой сзапятой. Некоторые директивы имеют параметры и аргументы. Параметры следуют сразуза директивой и разделяются косой чертой; аргументы следуют после параметров..DIRECTIVE/параметр/параметр ...аргумент; {комментарий}453.6.1 Программные модули (.MODULE)Директива .MODULE обозначает начало программного модуля и определяетназвание модуля. Исходный файл может содержать только один модуль.Директива имеет форму:.MODULE/параметр/параметр... имя модуля;В качестве параметров могут выступать: RAM или ROM тип памяти, ABS=aдpecабсолютный стартовый адрес (не используйте с STATIC), SEG=seg_name размещение вуказанном сегменте, ВООТ=0-7 размещение копии на странице начальной загрузки,STATIC статичное размещение модуля в памятиПараметры BOOT и STATIC используются только в системах с памятьюначальной загрузки (т.е.
все процессоры семейства, за исключением ADSP-2100). Второйспособ размещения модулей на страницах начальной загрузки реализуется прииспользовании ключа редактора связей -i.Если тип памяти не определен, то по умолчанию принимается тип RAM (ОЗУ).Параметр ABS размещает код модулей программ в определенных адресах памятипрограмм, что делает их неперемещаемыми.
Это означает, что редактор связейрезервирует память для модулей по указанным адресам. Модули, которые не имеютпараметра ABS, перемещаемы. Параметр SEG размещает модуль в указанный сегментпамяти, который объявлен в файле системной конфигурации. Если вы определяете обапараметра ABS и SEG и указываете абсолютные адреса, которых нет в данном сегменте,вы увидите сообщение об ошибке при запуске редактора связей.Параметр BOOT используется для размещения копии модуля на странице памятиначальной загрузки с указанным номером. Модуль будет сохранен в памяти начальнойзагрузки памяти до тех пор, пока он не будет загружен и выполнен. Можно разместитькопии модулей на нескольких загрузочных страницах, позволяя получить доступ к егопрограммам или данным, например:Пример: Декларация модуля.MODULE/BOOT-0/BOOT=1/BOOT=246Другой способ реализации этого, использование параметра STATIC которыйсохраняет модуль в памяти программ, когда загружаются страницы начальной загрузки.Параметр BOOT применяется также ко всем переменным .VAR и объявлениямбуферов данных внутри модуля - помните, что память начальной загрузки и памятьпрограмм, обычно в основном, содержат как программу, так и данные.Директива .ENDMODE указывает на завершение программного модуля.Программа ассемблера останавливается, когда достигает директивы .ENDMODE.Примеры объявления модулей:Пример: Объявление перемещаемого модуля filter-routine размещенного всегменте памяти с именем fir, который определен в выходном .LDF файлесистемного конфигуратора..MODULE/SEG=fir filter-routine;Пример: Объявляение модуля main-prog, который должен быть размещен впамяти RAM по адресу 40 (шестнадцатеричный).MODULE/RAM/ABS=0х0040 main-prog;.Система может иметь до 8 загружаемых страниц.
Когда выбираются атрибутызагружаемых модулей параметрами RAM, ROM, SEG и ABC, они применяются к памяти,где размещен код, во время выполнения, а не к памяти начальной загрузки. Такимобразом, при конфигурировании распределения памяти во время исполнения, вы должныоперировать терминами памяти программ и памяти данных. Редактор связей определяетрасположение программ и данных в памяти, в соответствии с вашими объявлениямисегментов для системного конфигуратора и вашим объявлением модуля на ассемблере.Редактор связей конструирует также страницы памяти начальной загрузки, но вы неможете напрямую указать расположение модуля в загрузочной памяти.Процессор не может получить и выполнить инструкцию из памяти начальнойзагрузки; содержимое страницы памяти начальной загрузки должно быть вначалезагружено во внутреннюю память программ, и только затем код выполняется.
Если выхотите, чтобы модуль (или переменная/буфер) существовали во внутренней ли внешнейпамяти процессора, в течение выполнения некоторой страницы начальной загрузки,необходимо ассоциировать ее определителем BOOT с этой страницей. Это заставитредактор связей оставить пространство для объекта во время выполнения кода страницы.47Выходной файл листинга редактора связей .шар показывает расположение вашейпрограммы в области загрузочной памяти, также как соответствующее отражение впамяти программ во время выполнения. Например, следующая директива зановообъявляет модуль main_prog от объявленного ранее.
Модуль будет сохранен на странице0:Пример: Сохранение модуля main_prog на странице 0.MODULE/RAM/ABS-0x0040/BOOT=0 main_prog;параметры RAM и ABS этой директивы применяются к внутренней памяти программпроцессора (считая, что ММА=0).Далее приведен пример, который сохраняет копии перемещаемого модуля нанескольких загрузочных страницах:Пример: Сохранение копии перемещаемого модуля shifter на несколькихзагрузочных страницах.MODULE/RAM/BOOT=0/BOOT=2/BOOT=3 shifter;Если разрабатывается программный модуль, который будет использоваться нанескольких страницах начальной загрузки, например, содержащий подпрограммы, вызахотите, чтобы код оставался на месте, при загрузке различных страниц. Для того чтобыдостигнуть этого, при объявлении имени модуля нужно указать параметр STATICПараметр ABS не может использоваться совместно с параметром STATIC.
ОпределительSTATIC предотвратит перезапись модуля, как в том случае, когда при сбросе загружаетсястраница 0 (если ММАР=0), так и в том, когда программно вызываются страницами 1-7.Редактор связей гарантирует это при размещении вашей программы в памяти. Еслимодуль не объявлен как STATIC, он может быть частично или полностью перезаписансодержимым какой-либо загрузочной страницы. Это применимо к модулю как в случае свнутренней, так и с внешней памятью.Когда редактор связей распределяет память для хранения вашей программы, онразбивает ее на 9 независимых частей: незагружаемая память программ/данных изагружаемые страницы 0-7.