Синтаксис команд Ассемблера. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Синтаксис команд Ассемблера.



Программа на языке ассемблера представляет собой последовательность операторов, описывающих выполняемые операции. Оператором (строкой) исходной программы может быть или команда, или псевдооператор (директива) Ассемблера. Команды выполняются в процессе решения задачи на компьютере, а директивы - в процессе ассемблирования (трансляции) программы. Следовательно, в отличие от команд псевдооператоры или директивы сообщают Ассемблеру (транслятору), что ему делать с командами и данными, которые вводятся в программе.

Команда может включать до 4-х полей следующего вида:

[метка:] мнемокод [операнд] [; комментарий]

Поскольку в [ ] указываются необязательные поля, то, следовательно, команда должна содержать мнемокод выполняемого действия. Поля могут набираться в любом месте строки, но отделяйте поля друг от друга хотя бы одним пробелом и, если хотите разобраться в своей программе по истечению времени, позаботьтесь о читабельности, что чаще всего обеспечивается за счет позиционирования полей. Пример команды со всеми полями:

GETCOUNT: MOV CX.DX  ;инициализация счетчика, поместить содержимое регистра DX в регистр СХ

Пример команды с полем мнемокода:

PUSHF

Эта команда сохраняет в стеке содержимое регистра флагов.

Следует отметить, что Ассемблер не различает прописные и строчные буквы.

В качестве операнда в команде может фигурировать константа, которая может быть введена в следующих формах:

- двоичной, как последовательность цифр 0 и 1, заканчивающихся буквой В, например, 10111010В;

- десятичной (в привычной десятичной системе счисления с необязательной буквой D на конце), например, 129D или просто 129;

- шестнадцатеричной, как последовательность цифр от 0 до 9 и букв от А до F, заканчивающаяся буквой Н. Первым символом может быть только цифра от 0 до 9, например, ОЕ23Н (в данном случае первая цифра информирует ассемблер о том, что Е23 число, а не идентификатор или

переменная);

- литералом, строка букв, цифр и других символов, заключенная в

кавычки или апострофы.

Мнемокоды могут иметь от 2 до 6 букв, при трансляции мнемокод преобразуется в числовое значение по таблице перекодировки (внутри транслятора). Мнемокоды имеют жесткий формат, предусматривающий 1,2 или отсутствие операндов. Если операндов 2, они отделяются друг от друга запятой.

3.Способы задания операндов

Операнды команды могут задаваться по-разному:

1) неявно на микропроцессорном уровне. Такие команды работают либо с регистрами, либо с флагами и в конкретной команде объект определяется кодом команды, например:

PUSHF - команда пересылки флагов в стек. Источник (откуда берутся

данные) и приемник (куда пересылаются) определяются кодом

команды;

или CLD - обнуление флага направления DF;

2) явно в самой команде (непосредственный операнд), например:

MOV АХ,0;

3) одним из регистров общего назначения (РОН) или сегментным регистром;

4) идентификатором переменной (меткой переменной, описанной в сегменте данных). В этом случае операнд располагается в ОЗУ. При косвенной адресации адрес-смещение переменной в ОЗУ помещается в РОН или индексный регистр и в команде используется ссылка на этот регистр;

5) номером порта ввода-вывода. В этом случае номер задается шестнадцатеричной константой;

6) регистром стека, когда используются команды работы со стеком и в этом случае операнд либо заносится в вершину стека, либо считывается из вершины стека.

Меткой является последовательность букв и цифр, после которой ставится двоеточие. Нельзя использовать в качестве меток имена регистров и мнемокоды, кроме того метка должна начинаться с буквы, но может содержать цифры и спец символы:?, @, /, _,$ и точку, однако точка может быть только первым символом метки.

Важной особенностью машинных команд является то, что они не могут манипулировать одновременно 2-мя операндами, находящимися в ОЗУ. Это означает, что в команде только 1 операнд может указывать на ячейку ОЗУ, 2-ой д.б. либо регистром, либо непосредственно указывать значение. По этой причине возможны следующие сочетания операндов в команде:

регистр - регистр;

регистр - память;

память - регистр;

регистр - непосредственный операнд;

память - непосредственный операнд.

Для команд характерно, что если в них присутствуют 2 операнда, то 1-ый является приемником, а 2-ой -источником, иначе говоря результат операции сохраняется по 1-ому адресу, вот почему 1-ый операнд никогда не может быть непосредственным операндом или иначе говоря, константой. Таблица 5.1

  4.Псевдооператоры или директивы

Псевдооператор Формат и Функция
1 2
Определения данных DB       [имя] DB выражение [,…….] определяет переменную или присваивает ячейке памяти начальное значение. Резервирует 1 или более байт (при наличии запятых)
DW [имя] DW выражение [,…….] аналогично предыдущему резервирует двухбайтовые слова
DD [имя] DD выражение [,…….] Резервирует 4-х байтовые двойные слова
   
Псевдооператор Формат и Функция
1 2
Определения сегмента или процедуры SEGMENT   Имя_cer SEGMENT [тип_выравнивания (подгонки)] [тип_связи] [‘класс’] .... Имя_cer ENDS Определяет границы сегмента программы. Обязательно содержит начало описания Имя_cer SEGMENT и окончание описания Имя_cer ENDS  
ASSUME ASSUME регистр_cer: Имя_cer [,…….] Или ASSUME регистр_cer: NOTHING Cообщает Ассемблеру, какой регистр сегмента связан с соответствующим сегментом программы. Оператор ASSUME регистр_cer: NOTHING отменяет действие всех предыдущих операторов ASSUME для данного регистра
PROC Имя PROC [NEAR] или Имя PROC FAR  ....  .... RET имя ENDP Присваивает имя последовательности операторов. Должно иметь начало PROC и окончание ENDP
Управление трансляцией END   END [метка точки входа] Отмечает конец исходной программы
Внешние ссылки PUBLIC PUBLIC идентификатор Делает определенный ранее идентификатор доступным другим модулям программы, которые впоследствии должны быть присоединены к данному модулю
EXTERN   EXTERN имя: тип [, ….] Указывает, что имя определено в другом модуле программы
INCLUDE   INCLUDE файл вставляет содержимое указанного файла в текущий файл исходной программы
Псевдооператор Формат и Функция
1 2
Определение идентификаторов EQU Имя EQU текст     или Имя EQU числовое_выражение Постоянно присваивает идентификатору имя текст или числовое_выражение Имя = числовое_выражение Числовое_выражение присваивается идентификатору имя, но может быть переприсвоено

 

Директивы определения данных присутствуют только в сегменте данных (сегмент данных является аналогом раздела VAR в программах на языке Паскаль). Как и в других языках программирования, для операций с данными необходимо указать в команде имя этого элемента данных, и также имена данных должны быть уникальными и не совпадать с зарезервированными словами (мнемокодами команд или псевдооператорами).

Важно отметить, что функциональное назначение сегментации несколько шире, чем просто разбиение программы на сегменты кода и данных. Сегментация является частью более общего механизма, связанного с концепцией модульного программирования. Этот механизм предполагает унификацию оформления объектных модулей, создаваемых компилятором, в том числе с разных языков программирования. Это позволяет объединять части большой программы, написанные на разных языках.

В директиве SEGMENT тип_выравнивания указывает, на границе байта (BYTE) слова (WORD), параграфа (PARA) или другой должен быть установлен адрес начала сегмента. Выравнивание на границу параграфа означает, что адрес начала сегмента д.б. кратен 16, слова - кратен 2.

Тип_связи (комбинирования сегментов) указывает, как нужно комбинировать сегменты различных модулей, имеющие одно и то же имя. По умолчанию предполагается PRIVATE, что означает, что сегмент не будет объединяться с сегментами с таким же именем вне данного модуля. PUBLIC заставляет компоновщик объединить все сегменты с одинаковым именем. Объединенный сегмент будет непрерывным, все адреса данных или команд будут определяется относительно начала этого сегмента. COMMON - все сегменты с одним именем располагаются по одному адресу (перекрываются).

'класс' заключенная в кавычки строка символов определяет назначение сегмента и помогает компоновщику определить порядок следования сегментов внутри программы. Формально этот порядок может быть любым, но лучше, если все сегменты кода (содержат команды обработки) объединяются в общую группу. Заключенное в кавычки слово класс может принимать следующие значения: code, stack, data, что означает соответственно сегмент кода (команд программы), сегмент стека и сегмент данных.

Все сегменты сами по себе равноправны, т.к. директива SEGMENT не содержит информации о функциональном назначении сегментов. Для того, чтобы Ассемблер использовал сегмент либо как сегмент кода, либо как сегмент данных, необходимо предварительно транслятору сообщить об этом в директиве ASSUME. Именно он сообщает транслятору, какой сегмент к какому сегментному регистру привязан.

Директивы определения данных по своим функциям и назначению аналогичны описаниям переменных в языках высокого уровня. Особенность в том, что слово DUP означает дубликат или иначе, повторение столько раз, сколько указано числом перед этим словом. Если после DUP в скобках указано значение, то оно будет занесено в память в начале работы программы. Если это значение ?, то выделенный для переменной участок памяти инициализироваться не будет (останется таким, каким было при выполнении предыдущих действий).

Ниже приводится таблица примеров определения переменных в программе на ассемблере.

 

Таблица 5.2. Примеры определения переменных.

Имя

Директива определения

значения комментарий

DB – определение байтов

BYTE1

DB

? Без указания значения
BYTE2

DB

48 Десятичная константа
BYTE3

DB

30Н Шестнадцатеричная константа
BYTE4

DB

01111010В Двоичная константа
BYTE5

DB

10 DUP(0) Десять нулевых значений
BYTE6

DB

‘Input simbol’ Строка символов
BYTE7

DB

‘12345’ Строка цифровых символов
BYTE8

DB

01, ‘Jan’, 02, ‘Feb’, 03, ‘mar’, 04,.... Таблица месяцев года, состоит из числовых значений номера месяца и его сокращенного названия

DW – определение слов (16 бит=2 байта)

WORD1

DW

0fff0h Шестнадцатеричная константа
WORD2

DW

01111010В Двоичная константа
WORD3

DW

BYTE3 Константа адреса переменной
WORD4

DW

2,3,4,5,6 Таблица из 5 констант
WORD5

DW

8 DUP(0) Восемь нулевых значений

DD – определение двойных слов (32 бита = 4 байта)

DWORD1

DD  ? Без значения

DWORD2

DD 41562 Десятичное значение

DWORD3

DD 48Н, 24Н, СА 3 шестнадцатеричные константы

DWORD4

DD WORD1 Адрес слова в виде сегмент:смещение

DWORD5

DD BYTE8-BYTE5 Разность между адресами переменных (количество байт)
         

 



Поделиться:


Последнее изменение этой страницы: 2021-02-07; просмотров: 301; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.240.21 (0.019 с.)