Программирование на ассемблере
Общие сведения
Текст исходной программы состоит из операторов ассемблера, каждый из которых занимает отдельную строку этого текста. Различают два типа операторов: инструкции и директивы. Первые при трансляции преобразуются в команды процессора, которые исполняются после загрузки в память загрузочного модуля программы, имеющего расширение .COM или .EXE . Операторы второго типа управляют процессом ассемблирования - преобразования текста исходной программы в коды объектного модуля (расширение .OBJ). Ассемблер интерпретирует и обрабатывает операторы один за другим, генерируя последовательность из команд процессора и байтов данных.
Особо следует остановиться на использовании макрокоманд. При программировании на макроассемблере можно формировать обращение к часто повторяющейся последовательности команд при помощи одного оператора. Этот прием несколько напоминает вызов подпрограмм в языках высокого уровня, но между ними лежит значительное различие, заключающееся в том, что подпрограмма, занимающая некоторый участок памяти, может быть исполнена неограниченное число раз путем передачи ей управления из вызывающей программы, в которую подпрограмма сама затем возвращает управление. В ассемблере используются макровызовы макроопределений. Макроопределение - это последовательность операторов, которые могут содержать формальные параметры. Макроопределение и команда обращения к макроопределению (макровызов) образуют макрокоманду. Макровызов - это оператор вызова макроопределения. Если макроопределение содержит формальные параметры, то макровызов обязан содержать фактические значения этих параметров, которые будут подставлены вместо соответствующих формальных. В результате макровызовва формируется реальная последовательность команд - макрорасширение. Макрорасширение вставляется в исходный текст программы на место оператора макровызова. Таким образом, в исходный текст программы макрорасширение одного и того же макроопределения может быть вставлено несколько раз, по числу макровызовов. Каждое макрорасширение после трансляции естественно занимает свой участок памяти.
В ассемблере имеется три вида вызова подпрограмм.
- CALL NEAR (короткий вызов);
- CALL FAR (длинный вызов);
- INT (прерывание),
но ни одн из них не содержит явного механизма передачи параметров. Этот механизм определяется внутренней организацией вызываемой подпрограммы.
Общий формат оператора ассемблера имеет следующий вид:
[Метка:]Код_операции[Операнд1[,Операнд2]][;Комментарий],
где элементы, указанные в квадратных скобках, могут отсутствовать.
Пробелы вводятся произвольно, но минимум один пробел должен быть после кода операции.
Метка - это идентификатор, присваиваемый первому байту того оператора, в котором она появляется.
Код_операции - это мнемоническое обозначение соответствующих команд процессора.
Операнды оператора ассемблера описываются выражениями. Выражения конструируются на основе операций над числовыми и текстовыми константами, метками и идентификаторами переменных с использованием знаков операций и некоторых зарезервированных слов. Ниже приведены все определенные в ассемблере операции. Порядок старшинства операций от высшей к низшей:
LENGTH, SIZE, WIDTH, MASK, (), [], <>
.
:
PTR, OFFSET, SEG, TYPE, THIS
HIGH, LOW
+ (unary), - (unary)
*, /, MOD, SHL, SHR
+, -
EQ, NE, LT, LE, GT, GE
NOT
AND
OR, XOR
SHORT, .TYPE
Старшинство операций определяет порядок, по которому будет вычисляться выражение. Более старшие операции будут производиться раньше операций, имеющих меньшее старшинство. Операции, стоящие в одной строке, имеют равный приоритет. Операции равного старшинства вычисляются слева направо. Операции, стоящие в скобках, выполняются первыми.
Пример оператора ассемблера: l0c_1: mov ax,(DAT_1+4) SHR 4, здесь использованы следующие операции ассемблера: ( ), + и SHR.