Операнды — это объекты, над которыми или при помощи которых выполняются действия, задаваемые инструкциями или директивами. Машинные команды мо- гут либо совсем не иметь операндов, либо иметь один или два операнда. Большин- ство команд требует двух операндов, один из которых является источником, а дру- гой — приемником (операндом назначения). В двухоперандной машинной команде возможны следующие сочетания операндов: в регистр — регистр; * регистр — память; в память — регистр; Ш непосредственный операнд — память. Здесь важно подчеркнуть, что один операнд может располагаться в регистре или памяти, а второй операнд обязательно должен находиться в регистре или не- посредственно в команде.
Непосредственный операнд может быть только источ- ником. Для приведенных ранее правил сочетания типов операндов есть исключения, которые касаются: » команд работы с цепочками, которые могут перемещать данные из памяти в память; . ii команд работы со стеком, которые могут переносить данные из памяти в стек, также находящийся в памяти; * команд типа умножения, которые, кроме операнда, указанного в команде, неяв- но используют еще и второй операнд. Операндами могут быть числа, регистры, ячейки памяти, символьные иденти- фикаторы. При необходимости для расчета некоторого значения или определения ячейки памяти, на которую будет воздействовать данная команда или директива, используются выражения, то есть комбинации чисел, регистров, ячеек памяти, идентификаторов с арифметическими, логическими, побитовыми и атрибутивны- ми операторами. Рассмотрим классификацию операндов, поддерживаемых транслятором ассем- блера. в Операнд задается неявно на микропрограммном уровне. В этом случае команда явно не содержит операндов. Алгоритм выполнения команды использует не- которые объекты по умолчанию (регистры, флаги в EFLAGS и т. д.). Например, команды CLI и STI неявно работают с флагом прерывания IF в регистре EFLAGS, а команда XLAT неявно обращается к регистру AL и строке в памяти по адресу, определяемому парой регистров DS:ВХ. |
| ![]() |
к Операнд задается в самой команде (непосредственный операнд). Это может быть число, строка, имя или выражение, имеющее некоторое фиксированное (кон- стантное) значение. Физически непосредственный операнд находится в коде команды, то есть является ее частью. Для его хранения в команде выделяется поле длиной до 32 битов (см. главу 3). Непосредственный операнд может быть только вторым операндом (источником). Операнд-приемник может находить- ся либо в памяти, либо в регистре. Например, команда mоv ах,Оffffhпересылает в регистр АХ шестнадцатеричную константу Оffffh . Команда add sum,2 складыва- ет содержимое поля по адресу sum с целым числом 2 и записывает результат по месту первого операнда, то есть в память. Если непосредственный операнд — имя, то оно не должно быть перемещаемым, то есть зависеть от адреса за- грузки программы в память. Такое имя можно определить оператором EQU или =. Пример: Глава 5. Синтаксис ассемблера
add [si],imd; сложение [si']:= [si]+3, ; здесь imd - непосредственный операнд mоv аl,5; аl:=5, здесь 5 - непосредственный операнд В данном фрагменте определяются две константы, которые затем используют- ся в качестве непосредственных операндов в командах пересылки MOV и сложе- ния ADD. Адресные операнды задают физическое расположение операнда в памяти путем указания двух составляющих адреса: сегмента и смещения (рис.
5.4). К примеру: mоv ах,θθθθh mоv ds,ах mоv ах,ds:θθθθh ; записать слово в ах из области памяти ; по физическому адресу 0000:0000 |
| ![]() |
Здесь третья команда MOV имеет адресный операнд. і⅜: Перемещаемые операнды — любые символьные имена, представляющие неко- торые адреса памяти. Эти адреса могут обозначать местоположение в памяти некоторой инструкции (если операнд — метка) или данных (если операнд — имя области памяти в сегменте данных). Перемещаемые операнды отличаются от адресных тем, что∙они не привязаны к конкретному адресу физической па- мяти. Сегментная составляющая адреса перемещаемого операнда неизвестна и определяется после загрузки программы в память для выполнения. К при- меру:
В этом фрагменте mаs_w — символьное имя, значением которого является ад- рес первого байта области памяти размером 25 слов. Полный физический адрес этой области памяти будет известен только после загрузки программы в па- мять для выполнения. ⅞ Счетчик адреса — специфический вид операнда. Он обозначается знаком $. Специфика этого операнда в том, что когда транслятор ассемблера встречает Синтаксис ассемблера 93 в исходной программе этот символ, то он подставляет вместо него текущее зна- чение счетчика адреса. Значение счетчика адреса, или, как его иногда называют счетчика размещения, представляет собой смещение текущей машинной коман- ды относительно начала сегмента кода. При обработке транслятором очеред- ной команды ассемблера счетчик адреса увеличивается на длину сформирован- ной машинной команды. Важно правильно это понимать. К примеру, обработка директив ассемблера не влечет за собой изменения счетчика, так как директи- вы ассемблера, в отличие от его команд, — это лишь указания транслятору на выполнение определенных действий по формированию машинного представ- ления программы, и для них транслятором не генерируется никаких конструк- ций в памяти.
В качестве примера использования в команде значения счетчика адреса можно привести следующий фрагмент:
При формировании выражения для перехода, подобного $+3, нужно помнить о длине самой команды, в которой это выражение используется, так как значе- ние счетчика адреса соответствует смещению в сегменте команд данной, а не следующей за ней команды. В нашем примере команда JМР занимает два байта. Нужно быть осторожным, длина этой и других команд зависит от того, какие в ней используются операнды. Команда с регистровыми операндами будет ко- роче команды, один из операндов которой расположен в памяти. В большин- стве случаев эту информацию можно получить, зная формат машинной коман- ды (см. главу 3 и приложение) и анализируя колонку файла листинга с объектным кодом команды. ⅛ Регистровый операнд — это просто имя регистра. В программе на ассемблере можно использовать имена всех регистров общего назначения и некоторых си- стемных регистров: D 32-разрядные регистры ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ESP, EBP; ? 16-paзpядныe регистры АХ, ВХ, СХ, DХ, SI, DI, SР, ВР; ? 8-разрядные регистры АН, AL, BH, BL, CH, CL, DH, DL; П сегментные регистры СS, DS, SS, ES, FS, GS; D системные регистры СRО, СR2,СRЗ, СR4, DRО, DR1, DR2, DRЗ, DR6, DR7 (см. описа- ние команды M O V в прил ожении). Например, команда add ax,bx складывает содержимое регистров АХ и ВХ и запи- сывает результат в ВХ. Команда dec si уменьшает содержимое SI на 1. И еще пример:
ш Операнд — порт ввода-вывода. Помимо адресного пространства оперативной памяти процессор поддерживает адресное пространство ввода-вывода, которое используется для доступа к устройствам ввода-вывода. Объем адресного про- странства ввода-вывода составляет 64 Кбайт. Для любого устройства компью- тера в этом пространстве выделяются адреса. Конкретное значение адреса в пре- делах этого пространства называется портом ввода-вывода. Физически порту Глава 5. Синтаксис ассемблера
ввода-вывода соответствует аппаратный регистр (не путать с регистром про- цессора), доступ к которому осуществляется с помощью специальных команд ассемблера IN и OUT. Например, in аl,6θh: ввести байт из порта 60h Регистры, адресуемые с помощью порта ввода-вывода, могут иметь разрядность 8,16 или 32 бита, но для конкретного порта разрядность регистра фиксирована. Команды IN и OUT работают с фиксированной номенклатурой объектов. В каче- стве источника информации или получателя применяются так называемые ре- гистры -аккумуляторы ЕАХ, АХ, AL. Выбор регистра определяется разрядностью порта. Номер порта может задаваться непосредственным операндом в коман- дах IN и OUT или значением в регистре DX. Последний способ позволяетдинами- чески определить номер порта в программе. Например,
⅜l Структурные операнды используются для доступа к конкретному элементу сложного типа данных, называемого структурой. Мы подробно разберемся со структурами в главе 13. * Записи (аналогично структурному типу) используются для доступа к битово- му полю некоторой записи (глава 13). II Операнд находится в стеке, ж Операнд располагается в памяти. Это наиболее сложный и в то же время наи- более гибкий способ задания операндов. Он позволяет реализовать прямой и кос- венный варианты адресации, являющиеся основными видами адресации. Последний вариант расположения операндов, ввиду его важности и большого объема, рассмотрим более подробно. Обсуждение будет сопровождаться примера- ми команд ассемблера, цель которых — демонстрация того, как изменяется фор- мат команды ассемблера при применении того или иного вида адресации. В связи с этим вернемся еще раз к рис. 2.8 (см. главу 2), который иллюстрирует принцип формирования физического адреса на адресной шине процессора. Видно, что ад- рес операнда формируется как сумма двух составляющих — сдвинутого на 4 бита содержимого сегментного регистра и 16-разрядного эффективного адреса, кото- рый в общем случае вычисляется как сумма трех компонентов: базы, смещения и индекса.