Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
конюховавсит.doc
Скачиваний:
106
Добавлен:
28.03.2015
Размер:
1.56 Mб
Скачать

5.2 Способы адресации данных и команд

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

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

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

Рисунок 5.1 – Непосредственная адресация

Примеры: mov ax, 5564h

mov ah, ‘A’

add al, 1101001100b

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

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

Рисунок 5.2 – Прямая адресация

Таким образом, в коде команды указывается смещение операнда в памяти.

Пример: d_s segment

mm dw 3154h

d_s ends

c_s segment

assume ds:d_s, cs:c_s

begin:

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

c_s ends

end begin

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

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

Примеры: mov ax, cx

add ah, al

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

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

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

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

Примеры: mov ax, [si]

Если в регистре si содержится 10, то в регистр ax будет помещено значение, находящееся по смещению 10 в сегменте данных.

Рисунок 5.3 – Косвенная адресация

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

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

Рисунок 5.4 – Формирование эффективного адреса при

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

(5.1)

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

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

(5.2)

Пример: d_s segment

mas db 3,5,1,8,9,’$’

d_s ends

c_s segment

assume ds:d_s, cs:c_s

begin:

mov si,0 ;в si-номер элемента массива

m1: mov ah, mas[si] ;mas- смещение

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

;номером в si

add si,1

jmp m1

c_s ends

end begin

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

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

(5.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

xchg ah, al

c_s ends

end begin

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

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

(5.4)

Пример: mov ax, bx[si]

Если в bx содержится 100, а в si находится 52, то по адресу (смещению) 152 в сегменте данных находится искомое данное.

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

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

(5.5)

Пример:

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

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

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