Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
I8086.DOC
Скачиваний:
64
Добавлен:
02.05.2014
Размер:
1.36 Mб
Скачать

Регистровые операнды

В командах обработки данных регистры общего назначения могут использоваться для хранения значений операндов. В этом случае говорят о регистровой адресации. Например, команда MOV AX,BXпересылает содержимое регистраBXв регистрAX.

Сегментные регистры могут использоваться в качестве операндов только в некоторых командах пересылки, а именно в инструкциях MOV,PUSHиPOP. Сегментный регистрCSможет служит источником в инструкцииMOV, но не может служить приёмником. Он не может также использоваться в командеPOP.

Регистр флагов и указатель инструкции не могут использоваться в качестве явно задаваемых операндов.

Операнды в памяти

Как уже отмечалось в подразделе 2.2.2 “Сегментация”, адрес памяти складывается из селектора сегмента и смещения. Смещение операнда в соответствующем сегменте называется эффективным адресом и вычисляется в процессе выполнения инструкции.

Для определения физического адреса явно заданного операнда, располагающегося в памяти, почти во всех случаях используется селектор сегмента, содержащийся в регистре сегмента данных DS. Исключением является лишь случай обращения к операнду, при вычислении эффективного адреса (смещения) которого используется содержимое регистраBP. В этом случае предполагается, что операнд располагается в сегменте стека, и используется селектор сегмента, хранящийся в регистреSS. В любом случае возможно использование префикса замены сегмента, явным образом определяющего, какой сегментный регистр содержит селектор, который должен использоваться при формировании физического адреса. На языке ассемблера префикс замены сегмента указывается с помощью мнемоники соответствующего сегментного регистра, предшествующей эффективному адресу операнда и отделяемой от него двоеточием. Например, в первой из следующих инструкций обращение осуществляется к сегменту данных, поскольку префикс замены сегмента не используется, а регистрBPв формировании эффективного адреса не участвует; во второй инструкции операнд находится в сегменте кода, поскольку сегмент задан явно. Эффективный адрес в обоих случаях является суммой содержимого регистраBXи константы 10h(называемойотклонением):

MOV 10h [BX], AX

MOV CS:10h [BX], AX

Эффективный адрес формируется суммированием содержимого одного или двух регистров общего назначения и 8- или 16-разрядного отклонения (константы, задаваемой кодом команды). Эффективный адрес всегда имеет размер 16 бит; перенос из старшего разряда, если он возникает, игнорируется.

Первым из регистров, участвующих в формировании эффективного адреса, может быть регистр BXилиBP, вторым –SIилиDI. Другие регистры общего назначения в формировании эффективного адреса применяться не могут.

С любым из регистров или их комбинаций может использоваться 8- или 16-разрядное отклонение; отклонение может также отсутствовать. Исключением является случай использования регистра BPбез регистраSIилиDI: в такой ситуации всегда должно применяться 8- или 16-разрядное отклонение. Кроме того, эффективный адрес может быть задан 16-разрядным отклонением без использования каких-либо регистров.

На языке ассемблера регистр, участвующий в формировании эффективного адреса, заключается в квадратные скобки. Если применяются два регистра, то либо каждый из них заключается в свои собственные скобки, либо они находятся внутри одних скобок и соединяются там знаком “+”. Например, запись [BX] [SI]эквивалентна записи[BX+SI]и означает, что эффективный адрес является суммой содержимого регистровBXиSI.

Если эффективный адрес состоит из одного отклонения и это отклонение задаётся в числовом виде, а не как метка, перед ним обязательно должно стоять указание WORD PTRилиBYTE PTRв зависимости от того, имеет ли этот операнд размер слово или байт. Это требование связано с тем, что числовая величина будет воспринята транслятором языка ассемблера не как отклонение, а как непосредственный операнд (см. следующий подраздел). Таким образом, для занесения содержимого регистраBHв ячейку памяти со смещением 100hв сегменте данных необходимо использовать следующую инструкцию:

MOV BYTE PTR 100h, BH

Если адресуемая ячейка памяти находится не в сегменте данных, указание BYTE PTRилиWORD PTRне требуется, поскольку перед отклонением будет указан префикс замены сегмента, например:

MOV ES:100h, BH

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

Способ формирования эффективного адреса определяется байтом ModRegR/Mкода команды. Формат этого байта и назначение его полей будет описано ниже, в подразделе 2.4.2 “Формат кода команды”. Здесь отметим, что двухразрядное полеMODопределяет наличие и размер отклонения, а трёхразрядное полеR/M– используемую комбинацию регистров. ПолеRegв формировании эффективного адреса не участвует.