Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 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 Мбайт физической памяти.

Адресация памяти в защищенном режиме процессора Intel 80286.

Рис. 6.3.  Адресация памяти в защищенном режиме процессора Intel 80286.

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

Еще более сложный метод адресации памяти с сегментированием использован в процессоре Intel 80386 и в более поздних моделях процессоров фирмы Intel. Этот метод иллюстрируется рис. 6.4.

Адрес памяти (физический адрес) вычисляется в три этапа. Сначала вычисляется так называемый эффективный адрес (32-разрядный) путем суммирования трех компонентов: базы, индекса и смещения (Base, Index, Displacement), причем возможно умножение индекса на масштаб (Scale). Эти компоненты имеют следующий смысл:

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

Рис. 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.  Выводы по практической работе.