Читайте также:
|
|
В большинстве языков программирования присутствуют средства, позволяющие игнорировать тот или иной участок программы в зависимости от выполнения условий, например: в языке C это осуществляется командами препроцессора #if, #ifdef, #ifndef и т.д. Ассемблер тоже предоставляет такую возможность.
if выражение...endifЕсли значение выражения — ноль (ложь), весь участок программы между IF и ENDIF игнорируется. Директива IF может также сочетаться с ELSE и ELSEIF:
if выражение...else...endifЕсли значение выражения — ноль, ассемблируется участок программы от ELSE до ENDIF, в противном случае — от IF до ELSE.
if выражение1...elseif выражение2...elseif выражение3...else...endifТак, если, например, выражение 2 не равно нулю, будет ассемблироваться участок программы между первой и второй директивой ELSEIF. Если все три выражения равны нулю, ассемблируется фрагмент от ELSE до ENDIF. Данная структура директив может использоваться в частном случае аналогично операторам switch/case языков высокого уровня, если выражения — проверки некоторой константы на равенство.
Кроме общих директив IF и ELSEIF ассемблеры поддерживают набор специальных команд, каждая из которых проверяет специальное условие:
IF1/ELSEIF1 — если ассемблер выполняет первый проход ассемблирования;
IF2/ELSEIF2 — если ассемблер выполняет второй проход ассемблирования (часто не работает на современных ассемблерах);
IFE выражение/ELSEIFE выражение — если выражение равно нулю (ложно);
IFDEF метка/ELSEIFDEF метка — если метка определена;
IFNDEF метка/ELSEIFNDEF метка — если метка не определена;
IFB <аргумент>/ELSEIFB <аргумент> — если значение аргумента — пробел (эти и все следующие директивы используются в макроопределениях для проверки параметров);
IFNB <аргумент>/ELSEIFNB <аргумент> — если значение аргумента — не пробел (используется в макроопределениях для проверки переданных параметров);
IFDIF <арг1>,<арг2>/ELSEIFDIF <арг1>,<арг2> — если аргументы отличаются (с различием больших и маленьких букв);
IFDIFI <арг1>,<арг2>/ELSEIFDIFI <арг1>,<арг2> — если аргументы отличаются (без различия больших и маленьких букв);
IFIDN <арг1>,<арг2>/ELSEIFIDN <арг1>,<арг2> — если аргументы одинаковы (с различием больших и маленьких букв);
IFIDNI <арг1>,<арг2>/ELSEIFIDNI <арг1>,<арг2> — если аргументы одинаковы (без различия больших и маленьких букв).
Иногда директивы условного ассемблирования используются для того, чтобы прервать ассемблирование программы, если обнаружилась какая-нибудь ошибка. Для таких случаев предназначены директивы условной генерации ошибок.
if $ gt 65535; Если адрес вышел за пределы сегмента..errendifВстретив директиву.ERR, ассемблер прекратит работу с сообщением об ошибке. Аналогично командам условного ассемблирования существуют модификации команды.ERR:
.ERR1 — ошибка при первом проходе ассемблирования;
.ERR2 — ошибка при втором проходе ассемблирования;
.ERRE выражение — ошибка, если выражение равно нулю (ложно);
.ERRNZ выражение — ошибка, если выражение не равно нулю (истинно);
.ERRDEF метка — ошибка, если метка определена;
.ERRNDEF метка — ошибка, если метка не определена;
.ERRB <аргумент> — ошибка, если аргумент пуст (эта и все следующие директивы используются в макроопределениях для проверки параметров);
.ERRNB <аргумент> — ошибка, если аргумент не пуст;
.ERRDIF <арг1>,<арг2> — ошибка, если аргументы различны;
.ERRDIFI <арг1>,<арг2> — ошибка, если аргументы отличаются (сравнение не различает большие и маленькие буквы);
.ERRIDN <арг1>,<арг2> — ошибка, если аргументы совпадают;
.ERRIDNI <арг1>,<арг2> — ошибка, если аргументы совпадают (сравнение не различает большие и маленькие буквы).
Мы уже упоминали выражения при описании многих директив ассемблера. Выражение — это набор чисел, меток или строк, связанных друг с другом операторами. Например: 2 + 2 — выражение, состоящее из двух чисел (2 и 2) и оператора +. Каждое выражение имеет значение, которое определяется как результат действия операторов. Так, значение выражения 2 + 2 — число 4. Все выражения вычисляются в ходе ассемблирования программы, следовательно, в полученном коде используются только значения.
Оператор <> (угловые скобки). Часть выражения, заключенная в угловые скобки, не вычисляется, а применяется как строка символов, например:
message1 equ <foobar>Оператор () (круглые скобки). Часть выражения, заключенная в круглые скобки, вычисляется в первую очередь.
mov al, 2*(3+4); mov al,14Арифметические операторы: + (плюс), – (минус), * (умножение), / (целочисленное деление), MOD (остаток от деления). Они выполняют соответствующие арифметические действия.
mov al,90 mod 7; mov al,6Кроме того, к арифметическим операторам относится унарный минус — минус, который ставят перед отрицательным числом.
Логические операторы: AND (И), NOT (НЕ), OR (ИЛИ), XOR (исключающее ИЛИ), SHL (сдвиг влево), SHR (сдвиг вправо). Эти операторы выполняют соответствующие логические действия.
mov ax,1234h AND 4321h; mov ax,0220hОператоры сравнения: EQ (равно), GE (больше или равно), GT (больше), LE (меньше или равно), LT (меньше), NE (не равно). Результат действия каждого из этих операторов — единица, если условие выполняется, и ноль — если не выполняется.
.errnz $ gt 65535; Если адрес больше 64 Кб – ошибкаОператоры адресации:
SEG выражение — сегментный адрес;
OFFSET выражение — смещение;
THIS тип — текущий адрес (MASM и TASM);
Тип PTR выражение — переопределение типа;
LARGE выражение — 32-битное смещение (TASM и WASM);
SMALL выражение — 16-битное смещение (TASM и WASM);
SHORT выражение — 8-битное смещение.
SEG и OFFSET возвращают соответствующую часть адреса своего аргумента:
mov dx, offset msg; Занести в DX смещение переменной msgTHIS создает операнд, адресом которого является текущее значение счетчика:
mov al, this byte-1; Занести в AX последний байт кода; предыдущей команды.PTR создает аргумент, адресом которого является значение выражения, а тип указан явно:
mov dword ptr [si],0; Записать 4 байта нулей по адресу DS:SILARGE, SMALL и SHORT используются с командами передачи управления, если возникают двусмысленности при косвенных переходах:
jmp large dword ptr old_address; Переменная old_address содержит 32-битное смещение jmp small dword ptr old_address; Переменная old_address содержит 16-битный сегментный адрес; и 16-битное смещение. jmp short short_label; Метка short_label находится; ближе, чем +128/-127 байт от этой команды, так что можно; использовать короткую форму команды JMP.Другие операторы:
. (точка) — ссылка на элемент структуры;
: (двоеточие) — переопределение сегмента;
[] (прямые скобки) — косвенная адресация;
? — неинициализированное значение;
число DUP (значение) — повторяющееся значение.
Эти пять операторов описаны ранее, когда говорилось о структурах данных, методах адресации и псевдокомандах определения данных.
Дата добавления: 2015-01-30; просмотров: 156 | Поможем написать вашу работу | Нарушение авторских прав |