Программирование на ассемблере

Общие сведения

Текст исходной программы состоит из операторов ассемблера, каждый из которых занимает отдельную строку этого текста. Раз­личают два типа операторов: инструкции и директивы. Первые при трансляции преобразуются в команды процессора, которые исполня­ются после загрузки в память загрузочного модуля программы, имеющего расширение .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.

Наши рекомендации