Ассемблер
· Введение
Ассемблер преобразовывает (транслирует) исходные файлы ассемблера в объектные файлы в машинном коде. Эти файлы находятся в общем формате объектного файла (COFF). Исходные файлы могут содержать следующие элементы ассемблера:
· Директивы Ассемблера.
· Макро директивы.
· Команды ассемблера.
Двухпроходовый ассемблер делает следующее:
· Преобразует операторы исходника в объектный файл.
· Создает листинг исходника (если требуется) и дает Вам возможность управлять им.
· Позволяет Вам сегментировать код по разделам и устанавливает счетчик команд SPC в каждом разделе объектного кода.
· Определяет глобальные символы и ссылки на них, создает перекрестные ссылки на листинг исходника (если требуется).
· Допускает условное ассемблирование.
· Допускает макросы, позволяя создавать макросы в исходнике или в библиотеке.
Вызвать ассемблер можно двумя способами:
· Запустить ASM. Ассемблер запускается с опциями по умолчанию. В частности без опции –L, которая заставляет его формировать файл листинга.
· В командной строке ОС ввести путь к файлу ASM, имя файла и опцию –L. Файл листинга будет сформирован, и допущенные ошибки можно увидеть.
В окне ассемблера нужно задать:
· Source file - исходный файл ассемблера. Если Вы не даете расширение, ассемблер использует заданное по умолчанию расширение .asm.
· Формат инструкций исходника
Исходник ассемблера C28x состоит из инструкций, которые могут содержать директивы ассемблера, команды ассемблера, макро-директивы, и комментарии. Инструкция может содержать 5 упорядоченных полей (метка, признак параллельности ||, мнемоника, список операндов, комментарий).
Примеры инструкций:
two .set 2 ; Символ two = 2
label: MVK two, A2 ; Запись значения two в регистр A2
.word 016h ; Инициализация слова значением 016h
Ассемблер читает до 200 знаков в строке. Любые знаки свыше 200 усекаются. Операционная часть инструкций (т.е. все, кроме комментариев) должна быть короче 200 знаков для правильной трансляции. Комментарии могут простираться за пределы 200 знаков, но усеченная часть не включается в файл листинга.
Следуйте этим рекомендациям:
· Все инструкции должны начаться с метки, разделителя (пробел или табулятор), звездочки, или точки с запятой.
· Метки не обязательны, если они используется, они должны начаться в столбце 1.
· Один (или больше) разделителей должно отделять каждое поле. Символы табуляции интерпретируются, как пробелы. Вы должны отделить список операндов от предшествующего поля пробелом.
· Комментарии необязательны. Комментарии, которые начинаются в столбце 1, могут начинаться со звездочки или точки с запятой (* или ;). Комментарии, которые начинаются в любом другом столбце, должны начинаться с точки с запятой.
· Мнемоника не может начинаться в столбце 1, иначе она будет интерпретироваться, как метка.
Метки. Они необязательны для всех команд ассемблера и для большинства (но не всех) директив ассемблера. Когда используется, метка должна начаться в столбце 1 инструкции. Метка может содержать до 128 алфавитно-цифровых знаков (A-Z, a-z, 0-9, _ и $). Метки чувствительны к регистру, и первый знак не может быть числом. Метка может сопровождаться двоеточием (:).
Если Вы не используете метку, знак в столбце 1 должен быть разделителем, звездочкой, или точкой с запятой.
Признак параллельности. Символы || указывают команды, которые выполняются параллельно с предыдущей командой. Вы можете иметь до 2 команд, выполняющихся параллельно. Следующий пример демонстрирует 2 команды (Inst1…Inst2), выполняющихся параллельно:
Inst1
|| Inst2
Inst3
Мнемоника. Может содержать
· Мнемоника инструкции (например, ADD, MOV).
· Директива ассемблера (например, .data, .list, .equ).
· Директива макроса (например, .macro, .var, .mexit).
· Вызов макроса (подпрограммы).
Поле операнда. Оно следует за мнемоническим полем и содержит один или большее количество операндов. Поле операнда требуется не для всех команд или директив. Операнд состоит из следующих элементов: символы, константы выражения (комбинация констант и символов). Операнды друг от друга отделяются запятыми (никаких разделителей!).
Комментарий. Может начинаться в любом столбце и простирается до конца исходной строки. Комментарий может содержать любые знаки ASCII, включая пробелы. Комментарии печатаются в листинге программы ассемблера, но не влияют на процесс трансляции.
Исходная инструкция, которая содержит только комментарий, допустима. Такой комментарий – заголовок части кода. Если она начинается в столбце 1, то может начинаться с точки с запятой (;) или звездочки (*).
Комментарии, которые начинаются где-нибудь еще на строке, должны начинаться с точки с запятой. Такой комментарий описывает операцию в строке кода.
· Константы
Ассемблер поддерживает каждую константу внутренне, как 32-разрядное число. Константы – не расширяются по знаку. Например, константа 00FFh равна 00FF (в 16-ричной системе) или 255 (в десятичной)..
Ассемблер поддерживает 7 типов констант:
· Двоичное целое. Это строка из 32 двоичных символов (0, 1), которая завершается символом B (или b). Если указано меньше 32 символов, ассемблер дополняет ведущие нули. Например, 0100000b это десятичное 32.
· Восьмеричное целое. Это строка из 11 восьмеричных символов (от 0 до 7), которая завершается символом Q (или q). Например, 10q это десятичное 8. В режиме C2xlp восьмеричное целое не поддерживаются.
· Десятичное целое. Это строка из десятичных символов (от 0 до 9), которая перекрывает диапазон от -2147 483 648 до 4 294 967 295. Например, 25 это десятичное 25.
· 16-ричное целое. Это строка из 8-ми 16-ричных символов (от 0 до 9, A - F ), которая завершается символом H (или h). Например, 78h это десятичное 120.
· Символьная константа. Это одиночный символ, помещенный в одиночные кавычки. Внутреннее представление это 8-битный номер символа ASCII. Например, '' – символ с номером 0, 'a' – символ с номером 97.
· Константа ассемблера. Это численное представления символа. Позволяет применять символы в выражениях.
· Константа с плавающей точкой. Это строка из десятичных символов в формате: знак числа (+ или -), значащая часть (целая часть, точка, дробная часть), символ степени E(или e), знак порядка, порядок. Например, +314.59e-2 - это π.
Обратите внимание на различие между символьными константами и символьными строками. Символьная константа представляет одиночное значение; строка - последовательность знаков.
Вы можете также использовать .set директиву, чтобы назначить символическую константу имени регистра. В этом случае, символ становится синонимом регистра:
sym .set B1
MVK 10, sym
· Символьные строки
Это строка кодовых знаков, заключенная в двойные кавычки. Двойные кавычки, которые являются частью символьной строки, представляются двумя последовательными двойными кавычками. Максимальная длина строки изменяется и определена для каждой директивы, которая требует символьную строку. Знаки представляются внутренне, как кодовые знаки ASCII с 8 битами. Примеры допустимых символьных строк:
“sample program” определяет строку «sample program» с 14 знаками.
“PLAN “”C””” определяет строку PLAN “C” с 8 знаками.
Символьные строки используются для следующих целей:
· Имена файлов, как в директиве .copy “имя файла”.
· Имена разделов, как в директиве .sect “имя раздела”.
· Директивы инициализации данных, как в .byte “символьная строка”.
· Операнды директив .string.
· Символы
Используются как метки, константы и символы замены. Имя символа - строка до 200 алфавитно-цифровых знаков (A-Z, a-z, 0-9, $, и _). Первый знак в символе не может быть числом, и символы не могут содержать внутренние пробелы. Символы, которые Вы определяете, чувствительны к регистру. Например, ассемблер различает ABC, Abc и abc, как три уникальных символа. Символ допустим только внутри ассемблерной программы.
Метки. Символы, используемые как метки, станут символическими адресами, которые связаны с ячейками памяти в программе. Метки, используемые локально, в пределах файла должны быть уникальны. Мнемонические коды операции и имена директив ассемблера без префикса (.) - допустимые имена меток.
Метки могут также использоваться, как операнды .global, .ref, .def, или .bss директив. Например:
.global label1
label2: MVK label2, B3
MVKH label2, B3
B label1
NOP 5
Локальные метки. Это специальные метки, чьи возможности и сила - временные. Локальная метка может быть определена двумя способами:
· $n, где n - десятичная цифра в диапазоне 0-9. Например, $ 4 и $ 1 являются допустимыми локальными метками..
· имя?, где имя - любое законное имя символа, как описано выше. Ассемблер заменяет вопросительный знак точкой, сопровождаемой уникальным числом. Когда исходный текст расширен, Вы не будете видеть уникальное число в файле листинга. Ваша метка появляется с вопросительным знаком, как это сделано в исходном определении. Вы не можете объявлять эту метку как глобальную.
Нормальные метки должны быть уникальны (они могут быть объявлены только однажды), и они могут использоваться как константы в поле операнда. Локальные метки, однако, могут быть отменены и определены снова. Локальные метки не могут быть определены директивами.
Символические константы. Символам могут быть присвоены постоянные значения. Используя константы, Вы можете сопоставлять имена с постоянными значениями. Директивы .set и .struct/.tag/.endstruct дают Вам возможность присвоить константам символические имена. Символические константы не могут быть переопределены.
Предопределенные символические константы. Ассемблер имеет несколько предопределенных символов, включая следующие типы:
· $, знак доллара, представляет текущее значение счетчика команд раздела (Segment Program Counter - SPC). $ - перемещаемый символ.
· Символы процессоров, включая TMS320C2700, TMS320C2800, TMS320C2800,_FPU32.
· Регистры управления ЦП, включая следующее:
ACC или AH, AL | Регистр аккумулятора и его части |
DBGIER | Регистр разрешения прерываний при отладке |
DP | Регистр указателя страницы памяти |
IER | Регистр разрешения прерываний |
IFR | Регистр флагов прерываний |
P или PH, PL | Регистр произведения и его части |
PC | Программный счетчик |
RPC | Счетчик возвратов программы |
ST0 | Регистр установки прерываний |
ST1 | Статусный регистр 0 |
SP | Регистр указателя стека |
TH | Старшая часть регистра сомножителя. Синоним T регистра |
XARn или ARnH, ARn n = 0-7 | Дополнительный регистр с номером n и его части |
XT T, TL | Регистр сомножителя и его части |
Символы замены. Символы могут быть назначены строковыми значениям (переменным). Это позволяет Вам заменять символьные строки, приравнивая их символическим именам. Символы, которые представляют строки знаков, называются символами замены. Когда ассемблер сталкивается с символом замены, его строковое значение заменяется именем символа. В отличие от символических констант, символы замены могут быть переопределены. Строка может быть назначена символу замены где-нибудь в пределах программы.
· Выражения
Выражение - константа, символ, или ряд констант и символов, разделенные арифметическими операторами. 32-разрядные диапазоны допустимых значений выражения: от -2147 483 648 до 2147 483 647 для знаковых значений, от 0 до 4 294 967 295 для значений без знака. Три основных фактора влияют на порядок выполнения выражения:
· Круглые скобки. Выражения, включенные в круглые скобки, всегда рассчитываются сначала. 8 / (4 / 2) = 4, но 8 / 4 / 2 = 1. Вы не можете заменять круглые скобки на фигурные скобки ({}) или квадратные скобки ([]).
· Группы по старшинству. Операторы, перечисленные ниже, разделены на девять групп по старшинству. Когда круглые скобки не определяют порядок оценки выражения, первой выполняется самая высокая по старшинству операция. 8+4/2=10 (сначала вычислено 4/2).
· Выполнение слева направо. Когда круглые скобки и группы по старшинству не определяют порядок оценки выражения, выражения вычисляются слева направо, кроме группы 1, в которой они вычисляются справа налево. 8/4*2=4, но 8/(4*2)=1.
Список операторов, которые могут использоваться в выражениях, в соответствие с группами старшинства.
Группа | Оператор | Описание |
+ - ~ ! | Унарный плюс Унарный минус Дополнение до 1 Логическое НЕ | |
* / % | Умножение Деление Деление по модулю. Результат – остаток от деления | |
+ - | Сложение Вычитание | |
<< >> | Сдвиг влево Сдвиг вправо | |
< < = > > = | Меньше чем Меньше или равно Больше чем Больше или равно | |
= ! = | Равно Не равно | |
& | Поразрядное И | |
^ | Поразрядное исключающее ИЛИ (XOR) | |
| | Поразрядное ИЛИ |
Внимание: операторы группы 1 вычисляются справа налево. Все другие операторы вычисляются слева направо.
Ассемблер проверяет условия переполнения и антипереполнения, когда арифметические операции выполняются во время трансляции. Он дает предупреждение (Value truncated – значение усечено) всякий раз, когда происходит переполнение или антипереполнение. Ассемблер не проверяет переполнение или антипереполнение при умножении.
Четкие выражения. Некоторые директивы ассемблера требуют четких выражений в качестве операндов. Четкие выражения содержат только символы или разовые константы ассемблера, которые определены прежде, чем с ними сталкиваются в выражении. Значение четкого выражения должно быть абсолютным (без знака). Это - пример четкого выражения:
1000h+X
где X был предварительно определен как абсолютный символ.
Условные выражения. Ассемблер поддерживает условные операторы, которые могут использоваться в любом выражении. Они особенно полезны для условной трансляции. Условные операторы включают следующие:
Оператор | Описание |
= | Равно |
!= | Не равно |
< | Меньше |
<= | Меньше или равно |
> | Больше |
>= | Больше или равно |
Условные выражения равны 1, если они истинны, и 0, если ложны и могут использоваться только на операндах эквивалентных типов. Например, абсолютная величина сравнивается с абсолютной величиной, но не с перемещаемым значением.
Законные выражения. За исключением перечисленных ниже случаев в выражениях нет ограничений на использование операторов, констант, внутренне или внешне определенных символов.
Когда выражение содержит более чем один перемещаемый символ или не может быть вычислено во время ассемблирования, ассемблер кодирует и помещает его в объектный файл и оно вычисляется линкером. Если финальное значение выражения требует больше места, чем отведено для него, то Вы получите сообщение линкера об ошибке.
Исключения для законных выражений. При использовании в регистрах режима относительной адресации выражение в квадратных скобках должно быть четким. Например, *+А4[15]
· Встроенные математические функции
Функция | Описание |
$acos(x) | Арккосинус в диапазоне [0, π], x [-1, 1] |
$asin(x) | Арксинус в диапазоне [-π/2, π/2], x [-1, 1] |
$atanx) | Арктангенс в диапазоне [-π/2, π/2] |
$atan2(x, y) | Арктангенс от y/x в диапазоне [-π, π] |
$ceil(x) | Округление до ближайшего целого, меньшего, чем x с плавающей точкой |
$cos(x) | Косинус от x |
$cosh(x) | Косинус гиперболический от x |
$cvf(n) | Превращает целое в формат с плавающей точкой |
$cvi(x) | Превращает число с плавающей точкой в целое |
$exp(x) | Экспонента от x |
$fabs(x) | Абсолютное значение от х |
$floor(x) | Округление до ближайшего целого, большего, чем x с плавающей точкой |
$fmod(x, y) | Остаток от деления x/y, знак как для x |
$int(x) | Возвращает 1, если x целое, иначе 0 |
$ldexp(x, n) | Умножение х на 2 в степени n |
$log(x) | Натуральный логарифм |
$log10(x) | Десятичный логарифм |
$max(x, y, ...z) | Наибольшее из списка |
$min(x, y, ...z) | Наименьшее из списка |
$pow(x, y) | Х в степени y |
$round(x) | Округление до ближайшего целого |
$sgn(x) | Знак числа. 1 для положительного, 0 для отрицательного |
$sin(x) | Синус от х |
$sinh(x) | Синус гиперболический от х |
$sqrt(x) | Квадратный корень из х |
$tan(x) | Тангенс от х |
$tanh(x) | Тангенс гиперболический от х |
$trunc(x) | Ближайшее целое по отношению к 0 |
· Режимы работы ассемблера
Возможны 3 режима:
· -v27 для C27x.
· -v28 для C28x.
· -v28 –C2xlp_src_compatible - для C28x с поддержкой дополнительных инструкций C2xlp.