3.4. Выражения

Мы уже упоминали выражения при описании многих директив ассемблера. Выражение - это набор чисел, меток или строк, связанных друг с другом оператора­ми. Например; 2 + 2 - выражение, состоящее из двух чисел (2 и 2) и оператора +. Каждое выражение имеет значение, которое определяется как результат действия операторов. Так, значение выражения 2 + 2 - число 4. Все выражения вычисля­ются в ходе ассемблирования программы, следовательно, в полученном коде ис­пользуются только значения.

Оператор <> (угловые скобки). Часть выражения, заключенная в угловые скобки, не вычисляется, а применяется как строка символов, например:

messagel equ <foobar>

Оператор () (круглые скобки). Часть выражения, заключенная в круглые скоб­ки, вычисляется в первую очередь.

mov       al,  2*(3+4) ;  mov al,14

Арифметические операторы: + (плюс), - (минус), * (умножение), /(целочис­ленное деление), MOD (остаток от деления). Они выполняют соответствующие

арифметические действия.

mov      al,90 mod 7 ;  mov al,6

Кроме того, к арифметическим операторам относится унарный минус - минус,

который ставят перед отрицательным числом.

Логические операторы: AND (И), NOT (HE), OR (ИЛИ), XOR (исключающее ИЛИ), SHL (сдвиг влево), SHR (сдвиг вправо). Эти операторы выполняют соот­ветствующие логические действия.

mov       ах, 1234li AND 4321П ; mov ax,0220h

Операторы сравнения:    (равно), GE (больше или       GT LE

(меньше или равно), LT (меньше), NE (не равно). Результат действия каждого из этих операторов — единица, если условие выполняется, и ноль - если не выполняется.

.еггпк   $ gt 65535 ;   Если адрес больше 64 Кб - ошибка.

Операторы адресации:

□ SEG выражение - сегментный адрес;

□ OFFSET выражение - смещение;

□ THIS тип - текущий адрес (MASM и TASM);

Q тип 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 ; Занести в АХ последний байт кода

; предыдущей команды,

PTR создает аргумент, которого является значение а тип

указан явно:

mov       dword ptr [si],О ;  Записать 4 байта нулей по адресу DS:SI.

LARGE, SMALL и SHORT используются с командами передачи управления, если возникают двусмысленности при косвенных переходах:

jmp       large dword ptr old_address ; Переменная oldjiddress содержит 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