операнд это код команды
Операнды в языке ассемблера
Операнд – объект, над которым выполняется машинная команда.
Операнды ассемблера описываются выражениями с числовыми и текстовыми константами, метками и идентификаторами переменных с использованием знаков операций и некоторых зарезервированных слов.
Операнды могут комбинироваться с арифметическими, логическими, побитовыми и атрибутивными операторами для расчета некоторого значения или определения ячейки памяти, на которую будет воздействовать данная команда или директива.
Способы адресации операндов
Под способами адресации понимаются существующие способы задания адреса хранения операндов:
Операнд задается на микропрограммном уровне (операнд по умолчанию): в этом случае команда явно не содержит операнда, алгоритм выполнения команды использует некоторые объекты по умолчанию (регистры, признаки и т.д.).
Операнд задается в самой команде (непосредственный операнд): операнд является частью кода команды. Для хранения такого операнда в команде выделяется поле длиной до 32 бит. Непосредственный операнд может быть только вторым операндом (источником). Операнд-получатель может находиться либо в памяти, либо в регистре.
Операнд находится в одном из регистров (регистровый операнд): в коде команды указываются именами регистров. В качестве регистров могут использоваться:
Прямая адресация : эффективный адрес определяется непосредственно полем смещения машинной команды, которое может иметь размер 8, 16 или 32 бита.
Косвенная адресация в свою очередь имеет следующие виды:
Косвенная базовая (регистровая) адресация. При такой адресации эффективный адрес операнда может находиться в любом из регистров общего назначения, кроме sp/esp и bp/ebp (это специфические регистры для работы с сегментом стека). Синтаксически в команде этот режим адресации выражается заключением имени регистра в квадратные скобки [].
Данный способ адресации позволяет динамически назначить адрес операнда для некоторой машинной команды и применяется при организации циклических вычислений и при работе со структурами данных, массивами.
Косвенная базовая (регистровая) адресация со смещением предназначена для доступа к данным с известным смещением относительно некоторого базового адреса, используется для доступа к элементам структур, когда смещение элементов известно заранее, на стадии разработки программы, а базовый (начальный) адрес структуры должен вычисляться динамически, на стадии выполнения программы. Модификация содержимого базового регистра позволяет обратиться к одноименным элементам различных экземпляров однотипных структур данных.
Косвенная индексная адресация. Для формирования эффективного адреса используется один из регистров общего назначения, но обладает возможностью масштабирования содержимого индексного регистра.
Значение эффективного адреса второго операнда вычисляется выражением mas+( esi *4) и представляет собой смещение относительно начала сегмента данных.
Наличие возможности масштабирования существенно помогает в решении проблемы индексации при условии, что размер элементов массива постоянен и составляет 1, 2, 4 или 8 байт.
Данный вид адресации также может использоваться со смещением.
Косвенная базовая индексная адресация. Эффективный адрес формируется как сумма содержимого двух регистров общего назначения: базового и индексного. В качестве этих регистров могут применяться любые регистры общего назначения, при этом часто используется масштабирование содержимого индексного регистра.
В случае использования косвенной базовой индексной адресация со смещением эффективный адрес формируется как сумма трех составляющих: cодержимого базового регистра, cодержимого индексного регистра и значения поля смещения в команде.
При использовании подобного выражения для перехода нельзя забывать о длине самой команды, в которой это выражение используется, так как значение счетчика адреса соответствует смещению в сегменте кода данной, а не следующей за ней команды. В приведенном выше примере команда jmp занимает 2 байта. Длина этой и некоторых других команд может зависит от того, какие в ней используются операнды. Команда с регистровыми операндами будет короче команды, один из операндов которой расположен в памяти. В большинстве случаев эту информацию можно получить, зная формат машинной команды.
Операторы в языке ассемблера
Операнды являются элементарными компонентами, из которых формируется часть машинной команды, обозначающая объекты, над которыми выполняется операция. В более общем случае операнды могут входить как составные части в более сложные образования, называемые выражениями . Выражения представляют собой комбинации операндов и операторов , рассматриваемые как единое целое. Результатом вычисления выражения может быть адрес некоторой ячейки памяти или некоторое константное (абсолютное) значение.
Выполнение операторов ассемблера при вычислении выражений осуществляется в соответствии с их приоритетами. Операции с одинаковыми приоритетами выполняются последовательно слева направо. Изменение порядка выполнения возможно путем расстановки круглых скобок, которые имеют наивысший приоритет.
Характеристика основных операторов.
Операторы сдвига выполняют сдвиг выражения на указанное количество разрядов. Например,
Операторы сравнения (возвращают значение истина или ложь) предназначены для формирования логических выражений. Логическое значение истина соответствует логической единице, а ложь – логическому нулю. Логическая единица – значение бита равное 1, логический ноль – значение бита, равное 0.
Назначение операторов сравнения приведено в таблице
Оператор | Условие |
eq | == |
ne | != |
lt | |
ge | >= |
Логические операторы выполняют над выражениями побитовые операции. Выражения должны быть константными. Например,
Индексный оператор [ ]. Транслятор воспринимает наличие квадратных скобок как указание сложить значение выражения за [] со значением выражения, заключенным в скобки. Например,
Наличие индексного оператора указывает транслятору, что необходимо получить значение по вычисленному адресу.
Оператор переопределения типа ptr применяется для переопределения или уточнения типа метки или переменной, определяемых выражением. Тип может принимать одно из следующих значений.
Тип | Пояснение | Назначение |
byte | 1 байт | переменная |
word | 2 байта | переменная |
dword | 4 байта | переменная |
qword | 8 байт | переменная |
tword | 10 байт | переменная |
near | ближний указатель | функция |
far | дальний указатель | функция |
В примере для сравнения значения по адресу esi с константой необходимо явно указать, данные какого типа будут сравниваться.
Оператор переопределения сегмента : (двоеточие) вычисляет физический адрес относительно конкретно задаваемой сегментной составляющей, в качестве которой могут выступать:
Оператор именования типа структуры . (точка) также заставляет транслятор производить определенные вычисления, если встречается в выражении.
Оператор получения сегментной составляющей адреса выражения seg возвращает физический адрес сегмента для выражения, в качестве которого могут выступать метка, переменная, имя сегмента, имя группы или некоторое символическое имя.
Оператор получения смещения выражения offset позволяет получить значение смещения выражения в байтах относительно начала того сегмента, в котором выражение определено. Например,
Оператор type возвращает число байтов, соответствующее определению указанной переменной:
Оператор width возвращает размер в битах объекта типа RECORD или его поля.
Операнды команд
Непосредственные операнды – это те операнды, которые записываются в сам код команды.
Константы могут представлять сами непосредственные операнды или абсолютные адреса памяти.
Имена– это адреса ячеек памяти. При трансляции ассемблер преобразует имена в адреса. Способ преобразования имени в значение зависит от принятых способов адресации. Основным способом адресации в машинных языках является относительная адресация: адрес в команде задается в виде смещения относительно какого-либо базового адреса, значение которого содержится в некотором базовом регистре. В качестве базового могут применяться или специальные регистры DS, CS (для Intel), или РОН (для RISC-архитектур).
Литералы – это записанные в особой форме константы. Физически литералы – это те же имена. При появлении в программе литерала ассемблер выделяет ячейку памяти и записывает в нее заданную в литерале константу. Далее при появлении этого литерала ассемблер заменяет далее все появления этого литерала на обращение по адресу этой ячейки. Таким образом, литеральные константы хранятся в памяти в одном экземпляре независимо от числа обращений к ним.
Специальный синтаксис – это явное описание способа адресации, т.е. указание базового регистра и смещения.
Директивы.
Директивы являются указаниями ассемблеру о том, как проводить ассемблирование.
EQU – директива определения имени. Перед этой директивой обязательно стоит имя, а операнд этой директивы определяет значение имени. Операндом может быть выражение, вычисляемое при ассемблировании. Имя также может определятся другим именем.
DD – директива определения данных. Выделяет ячейки памяти и записывает в них значения, определяемые операндом директивы. Одной директивой могут определяться несколько объектов данных. В ассемблерах могут существовать либо одна общая директива DD, тогда тип данных, размещаемых в памяти, определяется формой записи операндов, либо несколько подобных директив для разных типов данных.
BSS – директива резервирования памяти. Выделяет ячейки памяти, но значения в них не записывает. Объем выделяемой памяти определяется операндом директивы.
END – директива конца программного модуля. Указывает ассемблеру на прекращение трансляции. В главном модуле операндом этой директивы является имя точки, на которую передается управление при начале выполнения программы. Во всех других модулях эта директива употребляется без операндов.
Операнд это код команды
Алгоритм, написанный пользователем программы, в конечном счете реализуется в виде машинных команд. Под командой понимают совокупность сведений, представленных в виде двоичных кодов, необходимых процессору для выполнения очередного шага. В ходе команды для сведений о типе операции, адресной информации о нахождении обрабатываемых данных, а также для информации о месте хранения результатов выделяются определенные разряды (поля).
0
0
Форматом команды называется заранее обговоренная структура полей в её кодах, позволяющая ЭВМ распознавать составные части кода.
Распределение полей в формате команды может изменяться при смене способа адресации. Длина команды зависит от числа адресных полей. По числу адресов команды делятся на:
безадресные | |
одно-, двух-, трехадресные |
Длина кода команды измеряется в машинных словах. Чтобы получить возможность работать с минимальным числом адресных полей, результат, к примеру, можно размещать по месту хранения одного из операндов. Либо предварительно размещают один или несколько операндов в специально выделенных регистрах процессора.
Множество реализуемых машинных действий образует её систему команд. Система команд часто определяет области и эффективность применения ЭВМ. Состав и число команд должны быть ориентированы на стандартный набор операций, используемых пользователем для решения своих задач.
По функциональному назначению в системе команд ЭВМ различают следующие группы:
команды передачи данных (обмен входами между регистрами процессора, процессора и оперативной памятью, процессора и периферийными установками). | |
Команды обработки данных (команды сложения, умножения, сдвига, сравнения-). | |
Команды передачи управления (команды безусловного и условного перехода). | |
Команды дополнительные (типа RESET, TEST,-). |
Группа команд передачи управления обеспечивает принудительное изменение порядка выполнения команд в программе.
Оттранслированные команды записываются в соседние ячейки памяти в порядке их следования в программе. При естественном порядке выполнения команд в программе, адрес каждой следующей команды определяется по содержимому специального счетчика команд, который входит в состав процессора. Содержимое этого счетчика автоматически наращивается на 1 при выполнении очередной команды. При организации ветвления цикла или для перехода на подпрограмму в счетчик в счетчик команд принудительно записывается адрес перехода, указанный в ходе команды.
Большинство алгоритмов может быть реализовано небольшим базовым набором команд. Вместе с тем система команд должна быть полной, т.е. содержать все команды, которые необходимы для интерпретации алгоритма в машинных кодах. ЭВМ общего назначения имеет универсальный набор команд и применяется в основном для решения тривиальных (стандартных) задач.
Существуют 2 различных принципа поисков операндов в памяти: ассоциативный и адресный.