Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МАВЦ.464319.001ТУ 20140414 Семенов.doc
Скачиваний:
9
Добавлен:
01.07.2025
Размер:
2.98 Mб
Скачать

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

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

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

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

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

MOV AX.1024D; MOV AL.64; MOV ВХДАН; MOV CH,1011В; MOV AX.const; MOV AX,156*10H/2

и т.п.

Следует помнить, что диапазон чисел, посылаемых в регистры, должен быть огра­ничен вместимостью последнего: в 1-байтовый регистр (АН, AL, ВН и т. д.) можно посылать числа в диапазоне от 0 до +255 (целое без знака) или от -128 до +127 (целое со знаком); в 2-байтовый регистр (АХ, ВХ, СХ и т. д.) — от 0 до +65535 (це­лое без знака) или от -32768 до +32767 (целое со знаком).

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

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

MOV AX,BX

MOV BX,DX

MOV AH,BL

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

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

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

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

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

  • прямая обычная:

MOV AX, pole

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

pole DB X

pole DW X

и т. п.

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

  • прямая с индексированием:

MOV AX..pole[SI]

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

  • прямая с базированием:

MOV AX,pole[BX]

Аисп = Асмещ + Абазыбазы находится в регистре ВХ;

  • прямая с индексированием и базированием:

MOV AX,pole[SI+BX]

Аисп = Асмещ + Аинд + Абазы,

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

  • косвенная обычная:

MOV AX,[BX]

Исполнительный адрес берется в регистре ВХ, то есть Aисп = [ВХ];

  • косвенная с индексированием:

MOV AX,[BX+SI]

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

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

  • непосредственная обычная:

MOV AX,offset pole

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

  • непосредственная с индексированием:

MOV AX,[SI+const]

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

  • непосредственная с базированием:

MOV AX,[BX+const]

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

  • непосредственная с базированием и индексированием:

MOV AX,pole[SI+BX+const]

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

Почти все команды ассемблера за редким исключением (исключения: POP, PUSH, CALL, RET, IRET) в качестве Асегм обычно используют по умолчанию адрес, находящийся в регистре DS (в исполняемых программах типа .com – регистре CS); но регистр сегмента может быть задан и явно, например:

MOV AX, EX:pole: MOV AX,SS:[SI]

и т.п.

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

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