logo
Полный текст учебника

Адресация ячеек оп

Напомним, что абсолютный (полный, физический) адрес (Aабс) в общем случае является суммой адресов сегмента (Aсегм) и исполнительного адреса (Aисп), в свою очередь формируемого как сумма максимум 3-х адресов: смещения (Aсмещ), базы (Aбаз), и индекса (Aинд), то есть:

Aабс = Aсегм + Aисп = Aсегм + Aсмещ[+Aбаз][+Aинд]

Прямая адресация ячеек ОП имеет несколько вариантов:

Pole — символьное имя переменной X, для которой в ОП были предварительно отведены (или зарезервированы) ячейки памяти директивами типа:

pole DB X, pole DW X и т.п.

В команде в качестве Aисп берется Aсмещ первой ячейки поля, отведенной для переменной X.

В команде в качестве Aисп берется Aисп = Aсмещ + Aинд

Aинд находится в регистре SI.

Aисп = Aсмещ + Aбаз,

Aбаз находится в регистре BX.

Aисп = Aсмещ + Aинд + Aбаз

Существуют два варианта косвенной адресации ячеек ОП:

Исполнительный адрес извлекается из регистра BX, то есть Aисп = [BX].

Исполнительный адрес берется в виде суммы адресов, находящихся в регистрах BX и SI, Aисп = [BX] + [SI].

Смешанная непосредственная адресация ячеек ОП имеет несколько вариантов:

В качестве операнда берется непосредственно смещение адреса первой ячейки поля памяти, отведенного для переменной X; offset указывает, что берется не значение переменной X, а именно смещение ее адреса;

В качестве операнда берется сумма значения, хранящегося в регистре SI, и величины const; const может быть задана числом, идентификатором, смещением адреса переменной (offset pole) или их комбинацией — простым выражением;

Аналогично предыдущему варианту, но регистр SI замещен BX;

Аналогично предыдущему, но вместо содержимого одного регистра берется сумма содержимого регистров BX и SI.

Почти все команды ассемблера за редким исключением (исключения: POP, PUSH, CALL, RET, IRET) в качестве Aсегм обычно используют по умолчанию адрес, находящийся в регистре DS (в исполняемых программах типа .COM — в регистре CS); но регистр сегмента может быть задан и явно, например: MOV AX, EX:pole; MOV AX, SS:[SI] и т.п.

Последняя команда, в частности, позволяет реализовать прямой доступ к ячейке стековой памяти, стек при этом не изменяется.

Команды POP, PUSH, CALL, RET, IRET используют сегмент стека (регистр SS).