Описание процессора i8086 для программиста

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


Как уже отмечалось в подразделе 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 в формировании эффективного адреса не участвует.


Содержание раздела