Адресация регистров и ячеек памяти в ассемблере

При программировании на языке ассемблер используются неявный, непосредственный, прямой и косвенный методы адресации; причем для адресации регистров в МПП — только прямой, а для адресации ячеек ОП — прямой, косвенный и смешанный непосредственный методы. Рассмотрим их на примере адресации второго операнда в команде MOV (переслать).

Непосредственная адресация

Величина операнда i (impendence) непосредственно указывается в поле команды и может быть задана числом в десятичной, двоичной и шестнадцатеричной системах счисления (последний символ числа должен быть, соответственно, D (или никакой), B и H) или идентификатором, а также задана простым выражением, в котором указанные элементы связаны символами арифметических операций: +, -, * и /. Идентификатор (с соответствующим именем, например, const) должен быть предварительно описан в программе директивой типа: const equ 1024 или const = 1024.

Примеры непосредственной адресации:

MOV AX, 1024D; MOV AL, 64; MOV BX, 1AH; MOV CH, 1011B;

MOV AX, const; MOV AX, 156*10H/2

и т. п.

Следует помнить, что диапазон чисел, посылаемых в регистры, ограничивается вместимостью последнего: в 1-байтовый регистр (AH, AL, BH и т. д.) можно посылать числа в диапазоне от 0 до +255 (целое без знака) или от –128 до +127 (целое со знаком); в 2-байтовый регистр (AX, BX, CX и т. д.) — от 0 до +65 535 (целое без знака) или от –32 768 до +32 767 (целое со знаком).

Прямая адресация регистров МПП

В качестве адреса операнда указывается имя регистра (его символьное обозначение: AX, AL, AH, BX, BL и т. д.). Примеры:

MOV AX, BX

MOV BX, DX

MOV AH, BL

Необходимо следить, чтобы разрядность второго операнда (его регистра) соответствовала разрядности принимающего регистра.

Адресация ячеек ОП

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

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

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

l прямая обычная: MOV AX, pole.

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

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

l прямая с индексированием: MOV AX, pole[SI].

Aабс = Aсегм + [Aбаз] + Aсмещ

В команде в качестве Aисп берется Aисп = Aсмещ + Aинд (Aинд находится в регистре SI).

l прямая с базированием: MOV AX, pole[BX].

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

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

l прямая с индексированием и базированием: MOV AX, pole[SI+BX].

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

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

l косвенная обычная: MOV AX, [BX].

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

l косвенная с индексированием: MOV AX, [BX+SI].

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

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

l непосредственная обычная: MOV AX, offset pole.

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

l непосредственная с индексированием: MOV AX, [SI+const].

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

l непосредственная с базированием: MOV AX, [BX+const].

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

l непосредственная с базированием и индексированием: MOV AX, pole[SI+BX+const].

Аналогично предыдущему, но вместо содержимого одного регистра берется сумма содержимого регистров 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).








Дата добавления: 2016-04-02; просмотров: 2057;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.