Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Практическая работа №6
Методы адресации
Цель работы: ознакомление с возможными методами адресации операндов и команд микропроцессоров Intel x86; получение навыков использования команд с использованием различных методов адресации, использования массивов данных при разработке программ на языке Ассемблер.
Краткие теоретические сведения
1. Сегментирование памяти
Говоря об адресации, нельзя обойти вопрос о сегментировании памяти, применяемой в некоторых процессорах, например в процессорах IBM PC-совместимых персональных компьютеров.
В процессоре Intel 8086 сегментирование памяти организовано следующим образом.
Вся память системы представляется не в виде непрерывного пространства, а в виде нескольких кусков — сегментов заданного размера (по 64 Кбайта), положение которых в пространстве памяти можно изменять программным путем.
Для хранения кодов адресов памяти используются не отдельные регистры, а пары регистров:
· сегментный регистр определяет адрес начала сегмента (то есть положение сегмента в памяти);
· регистр указателя (регистр смещения) определяет положение рабочего адреса внутри сегмента.
При этом физический 20-разрядный адрес памяти, выставляемый на внешнюю шину адреса, образуется так, как показано на рис. 6.1, то есть путем сложения смещения и адреса сегмента со сдвигом на 4 бита. Положение этого адреса в памяти показано на рис. 6.2.
Сегмент может начинаться только на 16-байтной границе памяти (так как адрес начала сегмента, по сути, имеет четыре младших нулевых разряда, как видно из рис. 6.1), то есть с адреса, кратного 16. Эти допустимые границы сегментов называются границами параграфов.
Отметим, что введение сегментирования, прежде всего, связано с тем, что внутренние регистры процессора 16-разрядные, а физический адрес памяти 20-разрядный (16-разрядный адрес позволяет использовать память только в 64 Кбайт, что явно недостаточно).

Рис. 6.1. Формирование физического адреса памяти из адреса сегмента и смещения.

Рис. 6.2. Физический адрес в сегменте (все коды — шестнадцатеричные).
Применяются и более сложные методы сегментирования памяти. Например, в процессоре Intel 80286 в так называемом защищенном режиме адрес памяти вычисляется в соответствии с рис. 6.3.
В сегментном регистре в данном случае хранится не базовый (начальный) адрес сегментов, а коды селекторов, определяющие адреса в памяти, по которым хранятся дескрипторы (то есть описатели) сегментов. Область памяти с дескрипторами называется таблицей дескрипторов. Каждый дескриптор сегмента содержит базовый адрес сегмента, размер сегмента (от 1 до 64 Кбайт) и его атрибуты. Базовый адрес сегмента имеет разрядность 24 бит, что обеспечивает адресацию 16 Мбайт физической памяти.

Рис. 6.3. Адресация памяти в защищенном режиме процессора Intel 80286.
Таким образом, на сумматор, вычисляющий физический адрес памяти, подается не содержимое сегментного регистра, как в предыдущем случае, а базовый адрес сегмента из таблицы дескрипторов.
Еще более сложный метод адресации памяти с сегментированием использован в процессоре Intel 80386 и в более поздних моделях процессоров фирмы Intel. Этот метод иллюстрируется рис. 6.4.
Адрес памяти (физический адрес) вычисляется в три этапа. Сначала вычисляется так называемый эффективный адрес (32-разрядный) путем суммирования трех компонентов: базы, индекса и смещения (Base, Index, Displacement), причем возможно умножение индекса на масштаб (Scale). Эти компоненты имеют следующий смысл:

Рис. 6.4. Формирование физического адреса памяти процессора 80386 в защищенном режиме.
- смещение — это 8-, 16- или 32-разрядное число, включенное в команду. база — это содержимое базового регистра процессора. Обычно оно используется для указания на начало некоторого массива. индекс — это содержимое индексного регистра процессора. Обычно оно используется для выбора одного из элементов массива. масштаб — это множитель (он может быть равен 1, 2, 4 или 8), указанный в коде команды, на который перед суммированием с другими компонентами умножается индекс. Он используется для указания размера элемента массива.
Затем специальный блок сегментации вычисляет 32-разрядный линейный адрес, который представляет собой сумму базового адреса сегмента из сегментного регистра с эффективным адресом. Наконец, физический 32-битный адрес памяти образуется путем преобразования линейного адреса блоком страничной переадресации, который осуществляет перевод линейного адреса в физический страницами по 4 Кбайта.
В любом случае сегментирование позволяет выделить в памяти один или несколько сегментов для данных и один или несколько сегментов для программ. Переход от одного сегмента к другому сводится всего лишь к изменению содержимого сегментного регистра. Иногда это бывает очень удобно. Но для программиста работать с сегментированной памятью обычно сложнее, чем с непрерывной, несегментированной памятью, так как приходится следить за границами сегментов, за их описанием, переключением и т. д.
2. Адресация байтов и слов
Многие процессоры, имеющие разрядность 16 или 32, способны адресовать не только целое слово в памяти (16-разрядное или 32-разрядное), но и отдельные байты. Каждому байту в каждом слове при этом отводится свой адрес.
Так, в случае 16-разрядных процессоров все слова в памяти (16-разрядные) имеют четные адреса. А байты, входящие в эти слова, могут иметь как четные адреса, так и нечетные.
Например, пусть 16-разрядная ячейка памяти имеет адрес 23420, и в ней хранится код 2А5Е (рис. 6.5).

Рис. 6.5. Адресация слов и байтов.
При обращении к целому слову (с содержимым 2А5Е) процессор выставляет адрес 23420. При обращении к младшему байту этой ячейки (с содержимым 5Е) процессор выставляет тот же самый адрес 23420, но использует команду, адресующую байт, а не слово. При обращении к старшему байту этой же ячейки (с содержимым 2А) процессор выставляет адрес 23421 и использует команду, адресующую байт. Следующая по порядку 16-разрядная ячейка памяти с содержимым 487F будет иметь адрес 23422, то есть опять же четный. Ее байты будут иметь адреса 23422 и 23423.
Для различия байтовых и словных циклов обмена на магистрали в шине управления предусматривается специальный сигнал байтового обмена. Для работы с байтами в систему команд процессора вводятся специальные команды или предусматриваются методы байтовой адресации.
3. Методы адресации
Большая часть команд процессора работает с кодами данных (операндами). Одни команды требуют входных операндов (одного или двух), другие выдают выходные операнды (чаще один операнд). Входные операнды называются еще операндами-источниками, а выходные называются операндами-приемниками. Все эти коды операндов (входные и выходные) должны где-то располагаться. Они могут находиться во внутренних регистрах процессора (наиболее удобный и быстрый вариант). Они могут располагаться в системной памяти (самый распространенный вариант). Наконец, они могут находиться в устройствах ввода/вывода (наиболее редкий случай). Определение места положения операндов производится кодом команды. Причем существуют разные методы, с помощью которых код команды может определить, откуда брать входной операнд и куда помещать выходной операнд. Эти методы называются методами адресации. Эффективность выбранных методов адресации во многом определяет эффективность работы всего процессора в целом.
3.1. Неявная адресация
Местоположение операнда фиксировано и определяется кодом операции. Примеры:
mul al
У команды MUL фиксировано положение первого множителя и результата. Такой режим адресации делает машинную команду короткой, так как в ней отсутствует указание одного или нескольких операндов.
3.2. Непосредственная адресация
При непосредственной адресации значение операнда является частью машинной команды. Понятно, что в этом случае операнд представляет собой константу. Примеры:
mov al,5
add bx,1234h
lea dx,a
Обратите внимание, что в третьей строке в DX помещается адрес метки или переменной a, а вовсе не значение по этому адресу. Это особенность синтаксиса ассемблера. По сути, адрес метки тоже является числовой константой.

Рис. 6.6. Непосредственная адресация.
3.3. Абсолютная прямая адресация
В машинной команде содержится адрес операнда, находящегося в памяти. Пример:
mov dx,[a]
Вот тут уже в DX помещается значение из памяти по адресу a. Сравните с предыдущим пунктом. Квадратные скобки обозначают обращение по адресу, указанному внутри этих скобок.

Рис. 6.7. Прямая адресация.
3.4. Относительная прямая адресация
Этот режим используется в командах передачи управления. В машинной команде содержится смещение, которое прибавляется к значению указателя команд IP. То есть указывается не сам адрес перехода, а на сколько байтов вперёд или назад надо перейти. Пример:
metka:
...
loop metka
У такого режима адресации два преимущества. Во-первых, машинная команда становится короче, так она содержит не полный адрес, а только смещение. Во-вторых, такой код не зависит от адреса, по которому он размещается в памяти.
3.5. Регистровая адресация
Операнд находится в регистре (АX, BX, CX, DX, SI, DI, SP, BP). Пример:
add ax,bx

Рис. 6.8. Регистровая адресация.
3.6. Косвенная регистровая (базовая) адресация
Адрес операнда находится в одном из регистров BX, SI или DI.

Примеры:
add ax,[bx]
mov dl,[si]
Размер операнда в памяти здесь определяется размером первого операнда. Так как AX – 16-разрядный регистр, то из памяти берётся слово по адресу в BX. Так как DL – 8-разрядный регистр, то из памяти берётся байт по адресу в SI. Это правило верно и для других режимов адресации.

Рис. 6.9. Косвенная адресация.
3.7. Косвенная регистровая (базовая) адресация со смещением
Адрес операнда вычисляется как сумма содержимого регистра BX, BP, SI или DI и 8- или 16-разрядного смещения.

Примеры:
add ax,[bx+2]
mov dx,[array1+si]
В качестве смещения можно указать число или адрес метки. О размере смещения не беспокойтесь – компилятор сам его определяет и использует нужный формат машинной команды.
3.8. Косвенная базовая индексная адресация
![]()
Адрес операнда вычисляется как сумма содержимого одного из базовых регистров BX или BP и одного из индексных регистров SI или DI. Примеры:
mov ax,[bp][si]
add ax,[bx+di]
Например, в одном из регистров может находиться адрес начала массива в памяти, а в другом – смещение какого-то элемента относительно начала. А вообще, всё зависит от вашей фантазии ![]()
3.9. Косвенная базовая индексная адресация со смещением
Адрес операнда вычисляется как сумма содержимого одного из базовых регистров BX или BP, одного из индексных регистров SI или DI и 8- или 16-разрядного смещения.
![]()
Примеры:
mov al,[bp][di+5]
mov bl,[array2+bx+si]
E[BX+5][SI-2]; DATA[BX][SI]; [BX+2][SI]
Примеры решения задач:
;программа, использующая косвенную индексную адресацию
;программа обнуления ячеек массива
s_s segment stack "stack"
dw 12 dup(?)
s_s ends
d_s segment
aa db 11,1,2,3,4,5,6,7,8,9 ;массив чисел
d_s ends
c_s segment
assume ss:s_s, ds:d_s, cs:c_s;
begin: mov ax, d_s
mov ds, ax;
mov cx, 10 ;задание количества ячеек массива
mov si,0 ;задание номера первого элемента массива
L1: mov aa[si],0 ; обнуление si-того элемента массива
inc si ; переход к следующему элементу массива
loop L1 ; команда зацикливания
mov ah,4ch
int 21h
c_s ends
end begin
Задание на практическую работу:
1. Реализация программы, использующей различные режимы адресации:
Составить программу согласно условию:В сегменте данных задана последовательность чисел X: 0, 1, 2, 3, 5, 6, 10. Скопировать ее в последовательность Y, при этом увеличив каждый из элементов на 2.
Транслировать ассемблерный код. В случае нахождения ошибок – устранить их и повторить трансляцию. Скомпоновать программу редактором связей. Запустить программу в отладчике, в случае обнаружения ошибок в работе программы исправить их, повторить п. п.2, 3 Показать работу программы преподавателю.2. Реализация программы, использующей различные режимы адресации:
Узнать у преподавателя вариант работы. Составить программу согласно условию и варианту (таблица 6.1):В сегменте данных определен массив символов (строка). Выполнить заданное действие согласно заданному условию. Вывести на экран исходный и преобразованный массив.
Символы содержатся в памяти как числа (см. приложение «ASCII коды»). Таким образом, к символам применимы все те операнды и условия, что и для чисел.
Для определения нижней границы массива (или количества элементов массива) можно использовать команду LEA для определения адреса следующей переменной сегмента данных.
Транслировать ассемблерный код. В случае нахождения ошибок – устранить их и повторить трансляцию. Скомпоновать программу редактором связей. Запустить программу в консольном режиме, в случае обнаружения ошибок в работе программы исправить их, повторить п. п.2,3 Показать работу программы преподавателюТаблица 6.1 - данные для реализации согласно варианту
Вариант | Исходная сторока | Условие | Действие |
1 | I like read this book! | = « » | заменить на «_» |
2 | I like read this book! | > “i” | заменить на «*» |
3 | I like read this book! | >= “i“ | заменить на «!» |
4 | I like read this book! | < “p” | увеличить код символа на 5 |
5 | My favorite film is … | <= “m” | увеличить код символа на 2 |
6 | My favorite film is … | ≠ “i” | увеличить код символа на 1 |
7 | My favorite film is … | = «i» | уменьшить код символа на 5 |
8 | My favorite film is … | > “o” | уменьшить код символа на 3 |
9 | I understand this problem. | >= “ “ | уменьшить код символа на 1 |
10 | I understand this problem. | < “e” | заменить на «_» |
3. Реализация программы, использующей различные режимы адресации:
Составить программу согласно условию:Задан массив чисел. Определить есть ли в нём число 10.
Массив заполнить произвольными данными.
Транслировать ассемблерный код. В случае нахождения ошибок – устранить их и повторить трансляцию. Скомпоновать программу редактором связей. Запустить программу в отладчике, в случае обнаружения ошибок в работе программы исправить их, повторить п. п.2, 3 Показать работу программы преподавателю.4. Реализация программы, использующей различные режимы адресации:
Составить программу согласно условию:Задана строка символов, содержащая также символы «!». Вывести её на экран исходную строку и ее же, но без знаков «!»
Транслировать ассемблерный код. В случае нахождения ошибок – устранить их и повторить трансляцию. Скомпоновать программу редактором связей. Запустить программу в консольном режиме, в случае обнаружения ошибок в работе программы исправить их, повторить п. п.2,3 Показать работу программы преподавателюСодержание отчета по практической работе:
1. Титульный лист
2. Цель работы
3. Краткие теоретические сведения
4. Описание реализованных программ
5. Исходный ассемблерный код реализованных программ
6. Входные и выходные данные по программе.
7. Выводы по практической работе.


