Способы адресации данных процессора Intel 8086 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Способы адресации данных процессора Intel 8086



Способы адресации данных определяют механизмы вычисления эффективных адресов операндов в памяти и доступа к операндам. Выделяют следующие способы (режимы) адресации:

1. Непосредственный. Позволяет задавать фиксированные значения операнда непосредственно в адресной части команды, т.е. искомое значение является частью команды (рис. 5). Такой режим адресации удобен при работе с константами.

Код операции
Операнд

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

Примеры:  

mov ax, 5564h; Переслать в регистр ax значение 5564

               ; в шестнадцатеричной системе счисления

mov ah, ‘A’; Переслать в регистр ah символ A

add al, 11010011b; Сложить содержимое регистра al с числом

                        ; 11010011 в двоичной системе счисления

Следует помнить, что непосредственный операнд может быть задан только как операнд-источник.

Недостатком непосредственной адресации является необходимость расширения формата команд за счёт указания самого операнда в адресном поле команды.

2. Прямой. Адрес операнда содержится в коде команды (рис. 6). Используется при работе с переменными и константами, местоположение которых в памяти не меняется в процессе выполнения задачи.

Код операции
Адрес
Память
Операнд

Рис. 6. Прямая адресация

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

 

 

Пример:    

d_s segment

 mm dw 3154h

d_s ends

c_s segment

assume ds:d_s, cs:c_s

begin:

mov ax, mm;по адресу mm пересылается 3154 h

c_s ends

end begin

После выполнения выделенной подчёркиванием команды в регистре ax будет записано значение по адресу mm в памяти, т.е. число 3154 h.

3. Регистровый. Искомое значение операнда содержится в определённом командой регистре, т.е., в адресном поле команды указывается адрес регистра (рис. 7).

Код операции
Регистр

Рис. 7. Регистровая адресация

Примеры: mov ax, cx; Переслать в регистр ax содержимое

; регистра cx

                add ah, al; Сложить содержимое регистров ah и al

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

4. Регистровый косвенный. Является частным случаем косвенной адресации, когда адрес, указываемый в команде, является указателем ячейки, содержащей смещение операнда в памяти (рис. 8).

Фактически в команде указывается адрес адреса, причём в качестве регистра адреса может выступать базовый регистр BP или индексные регистры SI или DI.

Следует отметить, что в разных процессорах для размещения адреса могут использоваться и другие регистры.

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

Пример:      

d_s segment

 mm dw 3154h

d_s ends

c_s segment

assume ds:d_s, cs:c_s

begin:

 lea si, a;         загрузить в регистр si адрес ячейки mm

mov ax, [si]; в регистр ax пересылается значение по адресу,

               ; указанному в регистре si (т.е. число 3154 h)

c_s ends

end begin

 

Код операции
Код регистра (адрес адреса)
 
Адрес операнда
 
Регистры процессора
 
Операнд
 
Память

Рис. 8. Косвенная адресация

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

5. Регистровый относительный. Является обобщением методов адресации, обеспечивающих вычисление эффективного адреса (EA) или смещения операнда в памяти в виде суммы базового значения адреса и «смещения» disp, указываемого в команде (формула 1.1) и (рис. 9).

                          (1.1)

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

 
Память
Операнд
 
Базовый адрес
+
Смещение disp

Рис. 9. Формирование эффективного адреса при

относительной адресации

5.1. Индексный. Применяется для обработки упорядоченных массивов данных; при этом каждый элемент массива определяется собственным номером. Тогда базовый адрес массива задаётся смещением disp, указываемым в команде, а значение индекса (номер ячейки с элементом массива) определяется содержимым индексного регистра (формула 1.2).

                                (1.2)

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

Пример:    

d_s segment

 mas db 3,5,1,8,9,’$’; По адресу mas определена последовательность

                        ; из 6 однобайтовых элементов

                        ;(с учётом символа $)

                        ; $ - признак конца последовательности

d_s ends

c_s segment

assume ds:d_s, cs:c_s

begin:

  mov si,3si – смещение элемента (8) относительно начала

     ; массива, т.е., адреса mas

mov ah, mas[si]; mas - смещение массива в сегменте данных

ah – значение элемента массива mas

                        ;cо смещением в si, т.е. 8

c_s ends

end begin

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

В приведённом выше примере начало массива определяется адресом mas; требуемый элемент (8) является третьим (индексация начинается с нуля); каждый элемент массива занимает 1 байт в памяти. Чтобы определить местоположение данного элемента в сегменте данных, требуется в индексный регистр (в примере SI) поместить номер ячейки в массиве с нужным элементом (в примере 3 = 1×3) и сложить его с начальным адресом массива (в примере mas).

5.2. Базовый. Применяется для доступа к структурам данных переменной длины. Тогда базовый адрес, определяющий начало набора элементов, хранится в базовом регистре, а смещение в команде определяет расстояние до определённого элемента (формула 1.3).

                                   (1.3)

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

Рассмотрим пример организации записи о сотрудниках некоторого отдела и доступа к ней и её полям. Условимся, что все поля символьные.

Пример: worker struc;информация о сотруднике

 nam   db  30   dup (' ') ;фамилия, имя, отчество

 position db   30 dup (' ')       ;должность

 age    db  2 dup(‘ ’)                ;возраст

 standing db   2 dup(‘ ’)           ;стаж

 salary db  5 dup(‘ ’)                ;оклад в рублях

worker ends

d_s segment

 ;описание одного сотрудника

 sotr1 worker <‘Иванов Пётр Сергеевич’,

‘программист’, ‘30’, ‘8’, ‘15000’>

d_s ends

c_s segment

assume ds:d_s, cs:c_s

 begin:

 …

;загружаем в bx адрес начала записи (базовый адрес)

lea bx, sotr1

;в ax – значение по адресу bx+смещение по полю age

;т.е., от начала записи находим ячейки,

;содержащие информацию о возрасте

mov ax, word ptr [bx].age

c_s ends

end begin

Поля записи располагаются в смежных ячейках, но могут занимать разное количество байтов. В рассмотренном примере в описании структуры (записи) worker поля nam и position занимают по 30 байтов каждое, поля age и standing – по 2 байта каждое, а поле salary – 5 байтов. Имя sotr 1 в сегменте данных является адресом начала записи в сегменте данных, а имена полей фактически задают адреса (номера) ячеек, начиная с нуля, относительно начала записи. Чтобы определить местоположение конкретного поля записи (в примере age), необходимо знать адрес начала записи (в примере sotr 1) и номер ячейки, относительно начала записи, с которой начинается требуемое поле (age).

6. Базово-индексный. Используется для доступа к элементам массива, адресуемого указателем. Базовый адрес массива задаётся указателем базы (базовым регистром), а номер элемента массива – содержимым индексного регистра (формула 1.4).

                                         (1.4)

Пример:

d_s segment

 mas db 3,5,1,8,9,’$’; По адресу mas определена последовательность

                        ; из 6 однобайтовых элементов

                        ; (с учётом символа $)

                        ; $ - признак конца последовательности

d_s ends

c_s segment

assume ds:d_s, cs:c_s

begin:

  mov si,3si – смещение элемента (8) относительно начала

     ; массива, т.е., адреса mas

lea bx,mas; в регистр bx загружается адрес начала массива mas

mov ah, bx[si]; bx- смещение (адрес) массива в сегменте данных

; в ah – значение элемента массива mas

               ; cо смещением в si, т.е. 8

c_s ends

end begin

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

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

7. Относительный базовый индексный. Используется для адресации элементов в указываемом массиве записей. Базовый адрес массива задаётся указателем базы, номер записи (т.е., элемента массива) определяется содержимым индексного регистра, а смещение в команде указывает расстояние до записи (формула 1.5).

                              (1.5)

Чтобы узнать стаж работы третьего сотрудника, сначала нужно в базовый регистр загрузить адрес начала массива (в примере mas _ sotr), затем определить смещение (номер ячейки) в массиве, с которого начинается запись о третьем сотруднике (в примере – это вторая запись, поскольку индексация начинается с нуля), и записать его в индексный регистр. Для определения номера нужной ячейки требуется размер одной записи (woker) в байтах (директива type) умножить на индекс записи в массиве. И, наконец, в найденной записи следует найти нужное поле (в примере standing).

Таким образом, чтобы получить доступ к конкретному полю массива записей, сначала необходимо определить начало массива, в нём найти нужную запись, а уже в ней – требуемое поле.

Пример:

d_s segment

 ;опишем массив из 5 сотрудников со значениями по

 ;умолчанию

 mas_sotr worker 5 dup (<>)

d_s ends

c_s segment

 assume ds:d_s, cs:c_s

 begin:

 …

 ;в bx – адрес начала массива сотрудников

  lea bx, mas_sotr

 ;в si – смещение второй (начиная с нуля) записи

  mov si, (type worker)*2

 ; в ax – стаж второго сотрудника

  mov ax,[bx][si].standing

 …

c_s ends

end begin

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



Поделиться:


Последнее изменение этой страницы: 2020-12-09; просмотров: 438; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.89.173 (0.055 с.)