Косвенная базовая индексная адресация со смещением 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Косвенная базовая индексная адресация со смещением



Эффективный адрес формируется как сумма трех составляющих: cодержимого базового регистра, cодержимого индексного регистра и значения поля смещения в команде.

mov eax,[esi+5][edx]; пересылает в регистр eax двойное слово

; по адресу: (esi)+5+(edx).

add ax,array[esi][ebx]; производит сложение содержимого

; регистра ax с содержимым слова по адресу

; идентификатор array+(esi)+(ebx).  

· Операндом является порт ввода/вывода. Помимо адресного пространства оперативной памяти микропроцессор поддерживает адресное пространство ввода-вывода, которое используется для доступа к устройствам ввода-вывода. Объем адресного пространства ввода-вывода составляет 64 Кбайт. Для любого устройства компьютера в этом пространстве выделяются адреса. Конкретное значение адреса в пределах этого пространства называется портом ввода-вывода. Физически порту ввода-вывода соответствует аппаратный регистр (не путать с регистром микропроцессора), доступ к которому осуществляется с помощью специальных команд ассемблера in и out.

in al,60h; ввести байт из порта 60h

Регистры, адресуемые с помощью порта ввода-вывода, могут иметь разрядность 8, 16 или 32 бит, но для конкретного порта разрядность регистра фиксирована. В качестве источника информации или получателя применяются регистры-аккумуляторы eax, ax, al. Выбор регистра определяется разрядностью порта. Номер порта может задаваться непосредственным операндом в командах in и out или значением в регистре dx. Последний способ позволяет динамически определить номер порта в программе.

mov dx,20h; записать номер порта 20h в регистр dx

mov al,21h; записать значение 21h в регистр al

out dx,al; вывести значение 21h в порт 20h

· Операнд находится в стеке. Команды могут совсем не иметь операндов, иметь один или два операнда. Большинство команд требуют двух операндов, один из которых является операндом-источником, а второй — операндом назначения. Один операнд может располагаться в регистре или памяти, а второй операнд обязательно должен находиться в регистре или непосредственно в команде. Непосредственный операнд может быть только операндом-источником. В двухоперандной машинной команде возможны следующие сочетания операндов:

· Счетчик адреса – специфический вид операнда. Он обозначается знаком $. Специфика этого операнда в том, что когда транслятор ассемблера встречает в исходной программе этот символ, то он подставляет вместо него текущее значение счетчика адреса (регистр EIP). Значение счетчика адресапредставляет собой смещение текущей машин­ной команды относительно начала сегмента кода. При обработке транслятором очередной команды ассемблера счетчик адреса увеличивается на длину сформированной машинной команды. Обработка директив ассемблера не вле­чет за собой изменения счетчика. В качестве примера использования в команде значения счетчика адреса можно привести следующий фрагмент:

jmp $+3;безусловный переход на команду mov

nop; длина команды eld составляет 1 байт

mov al,1

При использовании подобного выражения для перехода нельзя забывать о длине самой команды, в которой это выражение используется, так как значение счетчика адреса соответствует смещению в сегменте кода данной, а не следующей за ней команды. В приведенном выше примере команда jmp занимает 2 байта. Длина этой и некоторых других команд может зависит от того, какие в ней используются операнды. Команда с регистровыми операндами будет короче команды, один из операндов которой расположен в памяти. В большинстве случаев эту информацию можно получить, зная формат машинной команды.

· Структурные операнды используются для доступа к конкретному элементу сложного типа данных, называемого структурой.

· Записи (аналогично структурному типу) используются для доступа к битовому полю некоторой записи. Для доступа к битовому полю записи используется директива RECORD.

Операнды являются элементарными компонентами, из которых формируется часть машинной команды, обозначающая объекты, над которыми выполняется операция. В более общем случае операнды могут входить как составные части в более сложные образования, называемые выражениями. Выражения представляют собой комбинации операндов и операторов, рассматриваемые как единое целое. Результатом вычисления выражения может быть адрес некоторой ячейки памяти или некоторое константное (абсолютное) значение.

Выполнение операторов ассемблера при вычислении выражений осуществляется в соответствии с их приоритетами (см. табл. 6). Операции с одинаковыми приоритетами выполняются последовательно слева направо. Изменение порядка выполнения возможно путем расстановки круглых скобок, которые имеют наивысший приоритет.

Таблица 5

Оператор Приоритет
length, size, width, mask, (), [ ], < > 1
. 2
: 3
ptr, offset, seg, this 4
high, low 5
+, - (унарные) 6
*, /, mod, shl, shr 7
+, -, (бинарные) 8
eq, ne, lt, le, gt, ge 9
not 10
and 11
or, xor 12
short, type 13

Дадим краткую характеристику основных операторов.

· Арифметические операторы. К ним относятся унарные операторы «+» и «-», бинарные «+» и «-», операторы умножения «*», целочисленного деления «/», получения остатка от деления «mod». Например,

tabsize equ 50;размер массива в байтах

sizeel equ 2;размер элементов

;вычисляется число элементов массива и заносится в регистр cx

mov cx,tab_size / sizeel;оператор "/"

Синтаксис арифметических операторов

· Операторы сдвига выполняют сдвиг выражения на указанное количество разрядов Например:

mask_b equ 10111011

...

mov al,mask_b shr 3; al=00010111

Синтаксис операторов сдвига

· Операторы сравнения (возвращают значение «истина» или «ложь») предназначены для формирования логических выражений. Логическое значение «истина» соответствует логической единице, а «ложь» – логическому нулю. Логическая единица – значение, все биты которого равны 1. Соответственно, логический нуль – значение, все биты которого равны 0.

tab_size equ 30;размер таблицы

...

mov al,tab_size ge 50;загрузка размера таблицы в al

cmp al,0;если tabsize < 50, то

je m1 ;переход на ml

...

m1:...

В этом примере, если значение tab_size больше или равно 50, то результат в аl равен FFh, а если tab_size меньше 50, то аl равно 00h. Команда cmp сравнивает значение al с нулем и устанавливает соответствующие флаги в FLAGS/EFLAGS. Команда je на основе анализа этих флагов передает или не передает управление на метку m1.

Синтаксис операторов сравнения

Таблица 6

Оператор Значение Условие
eq «ИСТИНА» выражение_1 равно выражению_2
ne «ИСТИНА» выражение_1 не равно выражению_2
lt «ИСТИНА» выражение_1 меньше, чем выражение_2
le «ИСТИНА» выражение_1 меньше или равно выражению_2
gt «ИСТИНА» выражение_1 больше, чем выражение_2
ge «ИСТИНА» выражение_1 больше или равно выражению_2

 

· Логические операторы выполняют над выражениями побитовые операции. Выражения должны быть абсолютными, то есть такими, численное значение которых может быть вычислено транслятором. Например,

L1 equ 10010011

...

mov al,L1 xor Olh;al=10010010

Синтаксис логических операторов

· Индексный оператор [ ]. Транслятор воспринимает наличие квадратных скобок как указание сложить значение выражения_1 за этими скобками со значением выражения_2, заключенным в скобки. Например,

mov ax,mas[si];ax=*(mas+(si))

В литературе принято следующее обозначение: когда в тексте речь идет о содержимом регистра, то его название берут в круглые скобки.

Синтаксис индексного оператора [ ]

· Оператор переопределения типа ptr применяется для переопределения или уточнения типа метки или переменной, определяемых выражением. Тип может принимать одно из следующих значений: byte, word, dword, qword, tbyte, near, far. Например,

d_wrd dd 0000000100100011b

...

mov al,byte ptr d_wrd+1;al=0001

Переменная d_wrd имеет тип двойного слова. Допустим, возникнет необходимость обращения не ко всему значению переменной, а только к одному из входящих в нее байтов (в примере – ко второму). Если попытаться сделать это командой mov al,d_wrd+1, то транслятор выдаст сообщение о несовпадении типов операндов. Оператор ptr позволяет непосредственно в команде переопределить тип и выполнить команду.

Синтаксис оператора ptr

· Оператор переопределения сегмента «:» (двоеточие) заставляет вычислять физический адрес относительно конкретно задаваемой сегментной составляющей: «имя сегментного регистра», «имя сегмента» из соответствующей директивы SEGMENT или «имя группы». Для выборки на выполнение очередной команды микропроцессор должен обязательно посмотреть содержимое сегментного регистра CS. А в этом регистре, как мы знаем, содержится (пока еще не сдвинутый) физический адрес начала сегмента команд. Для получения адреса конкретной команды микропроцессору остается умножить содержимое CS на 16 (что означает сдвиг на четыре разряда) и сложить полученное 20-битное значение с 16-битным содержимым регистра IP. Примерно то же самое происходит и тогда, когда микропроцессор обрабатывает операнды в машинной команде. Если он видит, что операнд – это адрес (эффективный адрес, который является только частью физического адреса), то он знает, в каком сегменте его искать (по умолчанию это сегмент, адрес начала которого записан в сегментном регистре DS).

.code

jmp met1; обход обязателен, иначе поле ind будет

; трактоваться как очередная команда

ind db 5; описание поля данных в сегменте команд

met1: mov al,cs:ind; al=5

Синтаксис оператора переопределения сегмента

· Оператор именования типа структуры «.» (точка) также заставляет транслятор производить определенные вычисления, если он встречается в выражении.

· Оператор получения сегментной составляющей адреса выражения seg возвращает физический адрес сегмента для выражения, в качестве которого могут выступать метка, переменная, имя сегмента, имя группы или некоторое символическое имя.

Синтаксис оператора получения сегментной составляющей

seg выражение

· Оператор получения смещения выражения offset позволяет получить значение смещения выражения в байтах относительно начала того сегмента, в котором выражение определено. Например,

.data

pole dw  5

.code

mov ax,seg pole

mov es,ax

mov dx,offset pole;es:dx = полный адрес pole

Синтаксис оператора получения смещения выражения

offset выражение

· Оператор определения длины массива length возвращает число элементов, определенных операндом dup. Если операнд dup отсутствует, то оператор length возвращает значение 01.Например,

tablea dw 10 dup(?)

...

mov  dx,length tablea ; dx=000a (10)

· Оператор type возвращает число байтов, соответствующее определению указанной переменной:

fldb db?

tablea dw 10 dup(?);Определение 20 слов

...

mov ax,type fldb;ax = 0001

mov ax,type tablea;ax = 0002

Так как область tablea определена как dw, то оператор type возвращает 0002h.

· Оператор size возвращает произведение длины length и типа type и используется при ссылках на переменную с операндом dup. Синтаксис оператора:

size переменная

Для предыдущего примера

mov dx,size tablea;dx = 0014h (20) (10*2)

· Оператор short –модификация атрибута near в команде jmp, если переход не превышает границы +127 и -128 байт. Например,

jmp short метка

В результате ассемблер сокращает машинный код операнда от двух до одного байта. Эта возможность оказывается полезной для коротких переходов вперед, так как в этом случае ассемблер не может сам определить расстояние до адреса перехода и резервирует два байта при отсутствии оператора short.

· Оператор width возвращает размер в битах объекта типа RECORD или его поля. Например,

mov ax,WIDTH MY_REC;ax=13

mov bx,WIDTH Bit8_11;cx=4



Поделиться:


Последнее изменение этой страницы: 2020-12-09; просмотров: 162; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.218.184 (0.024 с.)