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

8

Режимы адресации памяти

Типы адресации Ассемблера микропроцессора Intel 8086 , будем изучать на примере команд пересылки, без которых не обходится ни одна программа.

К этой группе команд относятся команды:

Mov <Операнд назначения (приемник)>, <операнд- источник>

Xchg <Операнд1>, <операнд2>.

Mov – это основная команда пересылки данных. В ней допустимо большинство из возможных сочетаний операндов:

Mov ax,table ;пересылка из памяти в регистр

Mov table, ax ; и наоборот

Mov ds, ax ; пересылка между 16-битовыми регистрами

Mov bl,al ; пересылка между 8-битовыми регистрами

Mov cl,-30 ;пересылка константы в регистр

Mov table,word ptr 25h ; пересылка константы в память

Обращаю Ваше внимание на тот факт, что если шестнадцатеричная константа начинается с цифры, то дополнительный признак 0 перед ней ставить необязательно! Признак обязателен для шестнадцатеричных констант, начинающихся с буквы, т.к. с буквы начинаются большинство (если не все) идентификаторов программы!

Обратите внимание на запись инструкции пересылки в память константы! Если в команде пересылки одним из операндов является регистр, то ассемблер пересылает столько байтов, каков размер регистра. При отсутствии в команде регистра ассемблер не знает, одну, двух или четырехбайтовую константу необходимо пересылать в память. В таком случае подсказкой для ассемблера должны быть модификаторы BYTE PTR (пересылка одного байта), WORD PTR (пересылка слова – двух байтов), DWORD PTR (пересылка двойного слова – четырех байтов).

В команде Mov исключаются следующие сочетания операндов:

- сегментный регистр-память. Нельзя загрузить в сегментный регистр значение непосредственно из памяти. Поэтому для такой загрузки используют обычно 2 команды пересылки – через регистр общего назначения или через стек. Если посмотрите на листинг программы, то в начале сегмента кодов увидите 2 команды пересылки, которые должны присутствовать в каждой программе:

DSEG SEGMENT PARA PUBLIC ‘DATA’ ; по этой команде ;Ассемблер назначит адрес начала сегмента для переменных (или данных) в программе

. . . . . . .

CSEG SEGMENT PARA PUBLIC ‘CODE’

ASSUME CS:CSEG, DS:DSEG, SS:STACK

OUR_PROG PROC

MOV AX,DSEG ; эти команды инициируют адрес

MOV DS,AX ; сегмента данных через РОН

- ячейка памяти-ячейка памяти. Нельзя осуществлять непосредственную пересылку данных из одной ячейки памяти и другую. Такая пересылка осуществляется через регистр общего назначения. Например,

DSEG SEGMENT PARA PUBLIC ‘DATA’

SOURCE DW 500 ; это слово будет скопирована

DEST DW (?) ; в эту переменную

DSEG ENDS

CSEG SEGMENT PARA PUBLIC ‘CODE’

ASSUME CS:CSEG, DS:DSEG, SS:STACK

OUR_PROG PROC

;занести в стек такие начальные значения, чтобы программа

; могла возвратить управление отладчику td

PUSH DS ; поместить в стек номер блока адреса возврата

SUB AX,AX ; обнулить регистр АХ, тоже можно сделать командой MOV AX,0

PUSH AX ; поместить в стек значение адреса возврата=0

MOV AX,DSEG ; инициировать адрес сегмента данных

MOV DS,AX

MOV AX, SOURCE ; переслать данные из SOURCE

MOV DEST,AX ; в DEST

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

- сегментный регистр-сегментный регистр. Нельзя пересылать содержимое одного сегментного регистра в другой сегментный регистр, однако при необходимости такой пересылки поступают также, как и в предыдущих случаях: пересылку осуществляют через регистр общего назначения;

- нельзя использовать сегментный регистр CS в качестве операнда назначения (приемника). Это объясняется тем, что регистр CS и регистр указатель команд IP вместе содержат адрес команды, которая должна выполняться следующей. Изменение содержимого CS равносильно операции перехода, ибо меняет последовательность команд.

Команда Xchg (exchange) меняет между собой значения двух регистров общего назначения или регистра ОН и ячейки памяти. Необходимое требование к операндам – чтобы они имели один тип. Например:

Xchg AX, BX ;обменять значения двух регистров (слова

Xchg AL, BH ; или байты

Xchg WORD1, DX ; обменять значения регистра и

Xchg DL, BYTE1 ;ячейки памяти.

Смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду, называется исполнительным адресом операнда. Этот исполнительный адрес показывает, на каком расстоянии (в байтах) от начала сегмента располагается искомый операнд. Напоминаю, что физический или абсолютный адрес в памяти ЭВМ определяется как

абсолютный адрес = адрес начала сегмента + смещение внутри данного сегмента

или как

абсолютный адрес = сегментный адрес + исполнительный адрес.

Причем обе приведенные выше записи содержат одни и те же слагаемые, определенные разными терминами. Отсюда следует, что исполнительный адрес переменной есть не что иное, как смещение относительно начала сегмента данных.

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

Различают адресацию операндов:

- непосредственную, которая заключается в указании в команде самого значения операнда, а не его адреса;

  • прямую, предполагающую указание в команде непосредственно исполнительного адреса;

  • косвенную, при которой в команде указывается адрес регистра или ячейки памяти, в которых хранится адрес операнда или его составляющие;

  • ассоциативную (используется в ассоциативных запоминающих устройствах, на ней останавливаться не будем);

  • неявную, когда адреса операндов в команде не указываются, а подразумеваются кодом операции.

Непосредственная адресация имеет место, если операнд-источник является константой или переменной, которой присвоено постоянное значение. Например:

MOV AX, 500 загружает значение 500 в РОН AX или

. . . . . . .

K EQU 1024

.. . . . . . . .

MOV CX, K загружает в РОН СХ константу 1024, определенную идентификатором К.

Следует отметить, что непосредственный операнд может быть задан простым выражением, в котором константы или идентификаторы констант связаны арифметическими операциями +, -, * или / (в таких выражениях не должно быть скобок). Например:

MOV AX, 156*10Н/2.

Следует помнить, что диапазон посылаемых чисел (значений непосредственного операнда) определяется вместимостью приемника - если это однобайтовый регистр (AH, AL, BL …), то в него можно посылать беззнаковые числа в диапазоне от 0 до 255, знаковые – от –128 до 127.

Прямая регистровая адресация имеет место в командах, оперирующих с содержимым РОН или сегментных регистров в качестве одного или обеих операндов команды. Например, команда:

MOV DS, AX

копирует содержимое РОН АХ в сегментный регистр DS, при этом содержимое регистра AX не изменяется.

При использовании этого вида адресации в программах необходимо следить, чтобы разрядности обеих регистров были одинаковы.

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

  • прямая обычная характеризуется тем, что смещение является составной частью команды и не требует при формировании исполнительного адреса дополнительных регистров, иными словами = . Обычно применяется, если операндом служит помеченная переменная, например:

MOV AX, SOURCE

загружает слово из ячейки памяти в регистр. При этом в памяти старший байт следует за младшим, а не предшествует ему. Это обусловлено тем, что в памяти ЭВМ старшая часть располагается в ячейках памяти со старшими адресами. Поэтому схема приведенной команды будет следующей:

0000

SOURCE

ВВ

0001

АА

0002

SOURCE+2

После выполнения вышеуказанной команды пересылки регистр АХ будет содержать АХ=ААВВ.

Примеры прямой обычной адресации вы можете видеть в программе, приведенной в приложении 1.А.

Приводимые далее режимы адресации будем рассматривать на примере двумерного массива SOURCE, определенного в сегменте данных как

SOURCE DB 1,2,3,4,5,6,

DB 10,20,30,40,50,60.

  • прямая с индексированием: =+, причем находится в индексном регистре, например:

  • MOV AX, SOURCE[SI].

Если занести в индексный регистр SI номер элемента массива, например, 6, то в результате выполнения команды в регистр АХ будет занесено значение 4. Чтобы уяснить этот момент, обратитесь к вышеприведенной таблице, из которой видно, что первый элемент массива имеет смещение 0, второй – смещение 2. Продолжив этот ряд, получим, что третий элемент расположен в памяти со смещением 4, а четвертый - со смещением 6 относительно начала массива, имеющего имя SOURCE.

  • прямая с базированием: =+, адрес находится в базовом регистре, например:

  • MOV AX, SOURCE[ВХ].

Такая адресация предназначена для доступа к данным с известным смещением относительно некоторого базового адреса, при этом исполнительный адрес получается путем сложения значения сдвига с содержимым регистров BX или BP. Например, таблица TABLE содержит поля фамилии (FAM 20 байт), имени (NAME 15 байт) и адреса (PLACE 50 байт). Тогда командами

MOV ВХ, 20

MOV AL, TABLE[ВХ]

получим в регистре AL первый байт имени.

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

MOV AX, SOURCE[ВХ+SI].

Возможна и такая форма записи команды:

MOV AX, SOURCE [BX][SI].

Здесь ВХ может быть связан с номером столбца, а SI– c номером строки, как в языках высокого уровня элементы массива определяются двумя индексами – SOURCE(J,I). Разница в том, что значения в регистрах базы и индекса должны учитывать размеры элементов массива и определять смещения. Так, пятый элемент во втором столбце определяется как

BX = (размер элемента в байтах * количество элементов в строке) *

(J-1)= = 2*6 = 12 (ВХ определяет смещение начала J-того столбца);

SI= размер элемента в байтах (I-1) = 2 4= 8.

(Единица из номеров строки и столбца вычитается потому, что смещения начинают считаться с нуля!)

Косвенная адресация (в некоторых источниках литературы /Абель/ эта адресация называется непрямой) использует способность компьютера адресовать память в форме сегмент:смещение. Для этого используются основные (BX и BP) и индексные регистры (DI и SI), заключенные в квадратные скобки, что определяет обращение к памяти.

Косвенный адрес, например [DI], указывает ассемблеру, что подлежащий использованию адрес памяти при исполнении программы будет храниться в регистре DI. Регистры BX, DI и SI связаны с DS как DS:BX, DS:DI и DS:SI и обрабатывают данные, определенные в сегменте данных, ВР связан с SS как SS:BP и применяется для обработки данных в стеке.

Правило использования косвенной адресации:

- если 1-ый операнд содержит косвенный адрес, то 2-ой операнд ссылается на регистр или непосредственное значение;

- если 2-ой операнд содержит косвенный адрес, то 1-ый операнд ссылается на регистр.

(Подумайте, почему оба операнда не могут содержать косвенные адреса?)

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

  • косвенная обычная, когда исполнительных адрес находится в регистре, например:

MOV AX, [BX].

Исполнительный адрес операнда может находиться в базовом регистре BX, регистре указателя базы BP или индексном регистре SI или DI. Косвенный регистровый операнд заключается в квадратные скобки, что означает ”в качестве адреса брать содержимое того адреса, на который указывает заключенный в квадратные скобки регистр”. Чтобы адрес-смещение переменной мог оказаться в РОН, используется команда пересылки следующего вида:

MOV BX, offset SOURCE.

Функции этой команды заключаются в том, что смещение (offset) ячейки памяти с именем SOURCE помещается в РОН ВХ. Естественно, в программе эта команда должна предшествовать команде пересылки с косвенной адресацией.

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

Так, командами

MOV BX, offset SOURCE

M1: MOV AX, [BX]

INC BX

INC BX

возвращаясь в цикле на метку М1 можно организовать последовательную пересылку в регистр АХ всех элементов массива SOURCE.

Еще пример. Пусть в сегменте данных описан вектор TABL DB 12,15,16,10,8,2,5,0.

Ниже первая команда загружает адрес вектора TABL в базовый регистр ВХ, а следующая команда заменяет первый байт в векторе на нулевое значение:

MOV BX,OFFSET TABL

MOV BYTE PTR [BX],0

после выполнения этих программных инструкций содержимое вектора будет: TABL DB 0,15,16,10,8,2,5,0.

-косвенная с индексированием адресация от предыдущей отличается тем, что исполнительный адрес берется в виде суммы адресов, находящихся в базовом и индексном регистрах:

MOV AX, [BX+SII].

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

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

MOV AX, offset pole.

Здесь в качестве непосредственного операнда берется смещение адреса переменной pole;

- непосредственная с индексированием, когда в качестве исполнительного адреса операнда берется сумма значений индексного регистра и непосредственного смещения:

MOV AX, [SI+const],

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

  • непосредственная с базированием, в которой, в отличие от предыдущей адресации, фигурирует базовый, а не индексный регистр:

MOV AX, [BX+const].

Форма записи смещения относительно базы может быть любой из 3-ех нижеприведенных:

MOV AX, [BX]+4 ,

MOV AX, 4[BX] ,

MOV AX, [BX+4].

Это примечание относится и к форме записи команд с индексированием (предыдущий вид адресации);

  • непосредственная с базированием и индексированием отличается тем, что для вычисления исполнительного адреса берется сумма базового и индексного регистра, к которым добавляется непосредственно фигурирующее в команде смещение:

MOV AX, pole[BX+SI+const].

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

MOV AX, [BX+2+DI],

MOV AX, [DI+BX+2]

MOV AX, [BX+2][DI]

MOV AX, [BX+2+DI]

MOV AX, [BX][DI+2]

MOV AX, NUMBER [BP][SI].

Вопросы для проверки усвоения режимов адресации.

1. В следующей команде найдите ошибку и предложите способ ее исправления:

MOV [SI],[BX]

2. Объясните, почему ассемблер выдает ошибку в команде

MOV [BX],25?

Исправьте ошибку.

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

Команда

Режим адресации

LEA BX,TABL

MOV DI,4

MOV CL,[BX]

MOV DL,[BX+3]

MOV AL,[BX+DI]

MOV CH,2[BX+DI]

4. Какой смысл имеют квадратные скобки в командах ассемблера?

Соседние файлы в папке Лекции по ассемблеру