Операнды
Операнды — это объекты, над которыми или при помощи которых выполняются
действия, задаваемые инструкциями или директивами. Машинные команды мо-
гут либо совсем не иметь операндов, либо иметь один или два операнда. Большин-
ство команд требует двух операндов, один из которых является источником, а дру-
гой — приемником (операндом назначения). В двухоперандной машинной команде
возможны следующие сочетания операндов:
в регистр — регистр;
регистр — память;
в память — регистр;
Синтаксис ассемблера 91
* непосредственный операнд — регистр;
непосредственный операнд — память.
Здесь важно подчеркнуть, что один операнд может располагаться в регистре
или памяти, а второй операнд
должен находиться в регистре или не-
посредственно в команде. Непосредственный операнд может быть только источ-
ником.
Для приведенных ранее правил сочетания типов операндов есть исключения,
которые касаются:
команд работы с цепочками, которые могут перемещать данные из памяти
в память;
команд работы со стеком, которые могут переносить данные из памяти в стек,
также находящийся в памяти;
команд типа умножения, которые, кроме операнда, указанного в команде, неяв-
но используют еще и второй операнд.
Операндами могут быть числа, регистры, ячейки памяти, символьные иденти-
фикаторы. При необходимости для расчета некоторого значения или определения
ячейки памяти, на которую будет воздействовать данная команда или директива,
используются выражения, то есть комбинации чисел, регистров, ячеек памяти,
идентификаторов с арифметическими, логическими, побитовыми и атрибутивны-
ми операторами.
Рассмотрим классификацию операндов, поддерживаемых транслятором ассем-
блера.
в Операнд задается неявно на микропрограммном уровне. В этом случае команда
явно не содержит операндов. Алгоритм выполнения команды использует не-
которые объекты по умолчанию (регистры, флаги в EFLAGS и т. д.). Например,
команды CLI и STI неявно работают с флагом прерывания IF в регистре EFLAGS,
а команда XLAT неявно обращается к регистру AL и строке в памяти по адресу,
определяемому парой регистров
к Операнд задается в самой команде (непосредственный операнд). Это может быть
число, строка, имя или выражение, имеющее некоторое фиксированное (кон-
стантное) значение. Физически непосредственный операнд находится в коде
команды, то есть является ее частью. Для его хранения в команде выделяется
поле длиной до 32 битов (см. главу 3). Непосредственный операнд может быть
только вторым операндом (источником). Операнд-приемник может находить-
ся либо в памяти, либо в регистре. Например, команда
пересылает
в регистр АХ шестнадцатеричную константу
Команда add sum,2 складыва-
ет содержимое поля по адресу sum с целым числом 2 и записывает результат по
месту первого операнда, то есть в память. Если непосредственный операнд —
имя, то оно не должно быть перемещаемым, то есть зависеть от адреса за-
грузки программы в память. Такое имя можно определить оператором EQU
или =. Пример:
num
5
imd =
mov
вместо num ассемблер везде подставляет 5
вместо num ассемблер везде подставляет 3
эквивалентно mov
здесь 5 - непосредственный операнд
92 Глава 5. Синтаксис ассемблера
add
сложение
; здесь imd - непосредственный
mov
здесь 5 - непосредственный операнд
В данном фрагменте определяются две константы, которые затем используют-
ся в качестве непосредственных операндов в командах пересылки
и сложе-
ния ADD.
Адресные операнды задают физическое расположение операнда в памяти путем
указания двух составляющих адреса: сегмента и смещения (рис. 5.4). К примеру:
mov
mov
mov
записать слово в ах из области памяти
по физическому адресу 0000:0000
Здесь третья команда
имеет адресный операнд.
Do'stlaringiz bilan baham: |