- •Классификация команд процессора Intel.
- •Команды пересылки данных: mov, cmoVcc, xchg, bswap, in, out.
- •Команды пересылки данных: push, pop, pusha, pushad, popa, popad.
- •Команды двоичной арифметики: add, adc, xadd, sub, sbb, inc, dec, neg.
- •Команды двоичной арифметики: imul, mul, idiv, div, cmp, cmpxchg, cmpxchg8b.
- •Команды десятичной арифметики: daa, das, aaa, aas, aam, aad.
- •Команды логических операций: and, or, xor, not, test.
- •Команды сдвиговых операций: sar, sal, shr, shl, shrd, shld.
- •Команды операций над битами и байтами: bt, bts, btr, btc, bsf, bsr, seTcc.
- •Команды сдвиговых операций: ror, rol, rcr, rcl.
- •Команды передачи управления: jmp, Jcc, jcxz, jecxz.
- •Команды передачи управления: loop, loope, loopz, loopne, loopnz.
- •Команды передачи управления: call, ret, retn, retf.
- •Команды передачи управления: int, iret, iretd, int3, into.
- •Префиксы повторения для строковых операций: rep, repe, repne, repz, repnz.
- •Строковые операции: movs, movsb, movsw, movsd, cmps, cmpsb, cmpsw, cmpsd.
- •Строковые операции: stos, stosb, stosw, stosd, ins, insb, insw, insd, outs, outsb, outsw, outsd.
- •Строковые операции: scas, scasb, scasw, scasd, lods, lodsb, lodsw, lodsd.
- •Команды управления флагами: stc, clc, cmc, std, cld, lahf, sahf.
- •Команды управления флагами: pushf, pushfd, popf, popfd, cli, sti, salc.
- •Директивы задания набора допустимых команд. Глобальные объявления.
- •Условное ассемблирование. Выражения. Операторы, используемые в выражениях.
- •Ввод данных с клавиатуры и вывод на экран.
Условное ассемблирование. Выражения. Операторы, используемые в выражениях.
В большинстве языков программирования присутствуют средства, позволяющие игнорировать тот или иной участок программы в зависимости от выполнения условий, например: в языке 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 ; Если адрес вышел за пределы сегмента.
.err
endif
Встретив директиву .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 смещение переменной msg
THIS создает операнд, адресом которого является текущее значение счетчика:
mov al, this byte-1 ; Занести в AX последний байт кода
; предыдущей команды.
PTR создает аргумент, адресом которого является значение выражения, а тип указан явно:
mov dword ptr [si],0 ; Записать 4 байта нулей по адресу DS:SI
LARGE, 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 (значение) — повторяющееся значение.
Эти пять операторов описаны ранее, когда говорилось о структурах данных, методах адресации и псевдокомандах определения данных.
LENGTH метка – число элементов данных
table dw 0,1,2,3,4,5,6,7 ; Определить таблицу из 8 слов.
table_count = length table ; table_count = 8
SIZE метка – размер данных
table_size = size table ; table_size = 16
