Лабораторная
работа №4
Тема: «Формат команд и способы адресации в реальном
режиме работы процессора»
Цель работы: изучить способы адресации 16-разрядного режима работы процессора и их
представление в кодах команд.
Ход работы:
1. Изучить теоретическую
часть
2.
Выполнить задание в соответствии с указаниями
3.
Ответить на контрольные вопросы
4.
Предъявить преподавателю результаты работы: проект и
исходный код
5.
Оформить отчет в соответствии с ходом работы
&Теоретическая часть:
Данные,
над которыми процессор выполняет свои операции, могут располагаться как в
регистрах, так и в оперативной памяти компьютера. Для работы с памятью
используются шина адреса и шина данных (см. рис. 1).
Рис. 1. Организация взаимодействия процессора и оперативной памяти
Физически
память устроена таким образом, что возможно обращение к отдельным байтам,
16-разрядным словам (два смежных байта памяти), 32-разрядным двойным словам
(четыре смежных байта памяти). Максимальный размер данных определяется
разрядностью шины данных и режимом работы процессора. В современных
персональных компьютерах шина адреса 32-разрядная, но в реальном (16-разрядном)
режиме работы процессора максимальный размер обрабатываемых данных – 16 бит,
т.е. слово.
Разрядность
шины адреса определяет максимальный объем оперативной памяти. В современных
персональных компьютерах шина адреса так же 32-разрядная, и, следовательно,
процессор имеет возможность одновременно обращаться к 232 = 4 Гбайт
оперативной памяти. Однако в реальном режиме работы из шины адреса используется
только 20 младших разрядов. Таким образом объем адресуемой памяти в реальном
режиме работы процессора составляет 220 = 1 Мбайт.
Так
как адреса принято записывать в шестнадцатеричной системе счисления, то мы
можем записать диапазон физических адресов для 20-разрядной шины адреса
следующим образом:
00000h £
[физический адрес] £ FFFFFh.
Здесь
и далее буква "h", записанная после числа,
подчеркивает, что данное число записано в шестнадцатеричной системе счисления.
Однако
все регистры процессора в реальном режиме 16-разрядные. Возникает проблема
представления 20-разрядного физического адреса памяти при помощи 16-разрядных
регистров.
Для
разрешения этой проблемы используется двухкомпонентный логический адрес.
Логический адрес состоит из 16-разрядных компонент: компоненты сегмента памяти
и компоненты смещения внутри сегмента.
Для
получения 20-разрядного физического адреса к сегментной компоненте (сегменту)
приписываются справа четыре нулевых двоичных разряда (для расширения до 20
разрядов), затем полученное число складывается с компонентой смещения (см. рис.
3.2). Перед сложением к компоненте смещения (смещению) слева дописываются
четыре нулевых бита (так же для расширения до 20 разрядов).
Логический
адрес принято записывать в форме <сегмент : смещение>.
Например,
пусть у нас есть логический адрес 1234h:0123h. Сегментная компонента равна 1234h, а компонента смещения – 0123h. Вычислим физический адрес,
соответствующий нашему логическому адресу:
* расширяем
до 20 бит сегментную компоненту, дописывая справа 4 нулевых бита, получаем
число 12340h (здесь четыре двоичных разряда
представляются одним шестнадцатеричным разрядом);
* расширяем
до 20 бит компоненту смещения, дописывая справа 4 нулевых бита, получаем число
00123h;
* для
получения физического адреса складываем полученные числа:
12340h
+ 00123h = 12453h.
Рис. 2. Формирование 20-разрядного физического адреса
Одному
физическому адресу может соответствовать несколько логических. Например,
полученному нами физическому адресу 12453h
соответствует логический 1245h:0003h.
Фактически
в схеме адресации памяти реального режима первый мегабайт памяти как бы
разбивается на сегменты. Физический адрес начала сегмента (базовый адрес сегмента)
равен расширенному до 20 бит сегментной компоненте адреса.
Сегменты
могут начинаться только с физического адреса, который кратен 16 байтам. Поэтому
он может начинаться только с границы параграфа (один параграф – это 16 идущих
подряд байта). Компонента смещения при такой схеме адресации является смещением
внутри сегмента памяти, а сам сегмент задается сегментной компонентой адреса
(см. рис. 3.3).
Логический
адрес в реальном режиме должен находиться в следующих пределах: 0000h:0000h £
[логический адрес] £ FFFFh:000Fh.
Архитектура
современных процессоров фирмы Intel, работающих в реальном режиме,
предполагает хранение сегментной компоненты адреса в сегментных регистрах: CS – сегмент кода; DS – сегмент данных; ES – дополнительный сегмент данных; SS – сегмент стека.
Компонента
смещения логического адреса текущей исполняемой команды всегда располагается в
указателе команд IP, а компонента смещения
логического адреса вершины стека в регистре SP. Компонента смещения логического адреса ячейки памяти,
рассматриваемой как данные, может располагаться в регистрах BX, BP, SI, DI.
Рис. 3. Схема адресации в реальном режиме
Режимы адресации
Набор
команд процессоров фирмы Intel обеспечивает выполнение операций
над операндами, которые находятся в регистрах, памяти и непосредственно в
команде. В набор входят безадресные, которые не имеют операндов, одно- и
двухадресные команды (по количеству операндов). Для одноадресных команд операнд
может располагаться в регистре или в памяти. Для двухадресных команд возможны
следующие схемы расположения операндов:
– регистр
— регистр;
– регистр
— память;
– память
— регистр;
– регистр
— непосредственные данные;
– память
— непосредственные данные.
Существует
несколько способов задания операндов команд процессора, которые обычно называют
режимами адресации. Эти способы содержат конкретное указание процессору откуда
брать или куда помещать данные. В частности для операндов, находящихся в
памяти, режимы адресации определяют правила формирования логического адреса
данных.
Рассмотрим
следующие режимы адресации реального режима:
– регистровая
адресация;
– непосредственная
адресация;
– прямая
адресация;
– косвенная
адресация;
– адресация
по базе;
– индексная
адресация;
– базово-индексная
адресация.
В
табл. 1 приведены форматы операндов языка ассемблера для всех семи режимов
адресации, реализуемых процессором в реальном режиме, и для каждого формата указано,
какой из сегментных регистров по умолчанию используется для вычисления
физического адреса. Обратите внимание, что во всех режимах предполагается
доступ к сегменту данных (т.е. сегментным регистром служит регистр DS),
и только в тех случаях, когда используется регистр ВР, предполагается
доступ к сегменту стека (т.е. сегментным регистром служит регистр SS).
Таблица 1
Форматы операндов
Режим адресации
|
Формат операнда
|
Сегментный регистр
|
Регистровый
|
AL, AH, AX
BL, BH, BX
CL, CH, CX
DL, DH, DX
SP
BP
SI
DI
|
Не используется
|
Непосредственный
|
Данное
|
Не используется
|
Прямой
|
Сдвиг
Метка
|
DS
DS
|
Косвенный
|
[BX]
[BP]
[DI]
[SI]
|
DS
SS
DS
DS
|
По базе
|
[BX + сдвиг]
[BP + сдвиг]
|
DS
SS
|
Индексная
|
[DI + сдвиг]
[SI] + сдвиг
|
DS
DS
|
Базово-индексная
|
[BX + SI + сдвиг]
[BX + DI + сдвиг]
[BP + SI + сдвиг]
[BP + DI + сдвиг]
|
DS
DS
SS
SS
|
Регистровая
адресация
В
данном режиме процессор принимает данные из регистра или помещает данные в
регистр. При этом данные могут быть восьмиразрядными (в этом случае
используются 8 восьмиразрядных регистров общего назначения: AL, AH, BL, BH, CL, CH, DL и DH),
а также шестнадцатиразрядными (используются 8 шестнадцатиразрядных регистра
общего назначения: AX, BX, CX, DX, SP, BP, SI,
и DI).
Непосредственная адресация
В
этом режиме процессор выбирает данные непосредственно из самого кода команды.
Этот режим адресации применяется для задания константных значений в качестве
операнда – источника данных (только в двухадресных командах). При этом
разрядность непосредственного операнда определяется разрядностью операнда –
приемника данных.
Например,
первый операнд (приемник данных) команды MOV AX,34h имеет регистровую адресацию, т.е. результат ее выполнения
помещается в регистр (в данном случае AX),
а второй операнд (источник данных) имеет непосредственную адресацию, т.е.
является константой 0034h и располагается в коде этой команды.
Таким образом данная команда помещает константу 0034h в регистр AX.
Прямая адресация
При
этом режиме адресации операнд располагается в оперативной памяти, а адрес
операнда (точнее компонента смещения логического адреса) располагается в коде
команды. Для обращения к такому операнду процессор формирует физический адрес,
выбирая компоненту сегмента из сегментного регистра DS. Поскольку обращение к операнду требует
от процессора выполнения определенных действий, компоненту смещения адреса
операнда принято называть исполнительным адресом.
Обычно
прямая адресация применяется, если операндом является метка (имя ячейки
памяти). Ассемблер, встроенный в debug, не поддерживает метки, и при применении
прямой адресации необходимо прямо указывать смещение конкретной ячейки памяти.
Чтобы различать непосредственные данные и исполнительный адрес последний
берется в квадратные скобки. Например, команда MOV AX,[0034h] в отличие от предыдущего случая помещает
в регистр AX не константу 0034h, а содержимое слова, находящегося по
адресу DS:0034h.
Косвенная адресация
Как
и в случае прямой адресации, операнд, имеющий косвенную адресацию располагается
в памяти, однако исполнительный адрес операнда находится не в коде команды, а в
одном из базовых или индексных регистров: BX, BP, SI и DI.
При вычислении физического адреса операнда процессор использует содержимое
сегментного регистра DS, если исполнительный адрес
располагается в BX, SI, либо DI, и содержимое сегментного регистра SS, если исполнительный адрес находится в
регистре BP.
Чтобы
различать регистровую и косвенную адресацию, при косвенной адресации имя
регистра заключается в квадратные скобки. Например, команда MOV [BX],BX, в которой первый операнд имеет
косвенную адресацию, а второй регистровую, помещает содержимое регистра BX в ячейку памяти с адресом DS:BX.
Адресация по базе
Этот
режим адресует данные в памяти. При адресации по базе процессор вычисляет
исполнительный адрес с помощью сложения значения сдвига, который находится в
коде команды с содержимым регистров BX или BP.
Данный
режим адресации удобно использовать при доступе к структурированным записям
данных, расположенным в разных областях памяти. В этом случае базовый адрес
записи помещается в базовый регистр и доступ к ее отдельным элементам
осуществляется по их сдвигу относительно базы. А для доступа к разным записям
одной и той же структуры достаточно соответствующим образом изменить содержимое
базового регистра. Например, команда MOV byte ptr [BP + 4],3Fh, в которой первый операнд имеет адресацию
по базе, а второй непосредственную адресацию, помещает значение константы 3Fh в байт, имеющий адрес SS:BP + 4h. Для указания того, что в данном случае мы работаем именно с
байтами, используется префикс byte ptr (word ptr префикс используется для указания того,
что действия производятся над словами). Первый операнд этой команды можно
трактовать как поле некоторой записи, располагаемой в сегменте стека. Базовый
исполнительный адрес этой записи размещен в регистре BP, а сдвиг поля относительно этой базе,
равный 4h, размещен в коде команды.
Индексная адресация
И
этот режим адресует данные в памяти. В этом случае исполнительный адрес
вычисляется как сумма значений сдвига, который находится в коде команды, и
индексного регистра (DI или SI). Этот режим адресации удобен для
доступа к элементам массива, когда сдвиг указывает на начало массива, а
индексный регистр – на его элемент.
Индексная
адресация отличается от базовой только используемыми регистрами и трактовкой
содержимого регистра и сдвига.
Базово-индексная адресация
Как
и в предыдущих случаях адресуется операнд в памяти. При базово-индексной
адресации исполнительный адрес вычисляется как сумма значений базового
регистра, индексного регистра и, возможно, сдвига, который находится в коде
команды.
Например,
команда MOV AL,[BX + SI + 006Dh] имеет два операнда, первый из которых, –
регистр AL, а второй – байт, расположенный в
памяти. Для обращения ко второму операнду применяется базово-индексная
адресация. Данный байт можно рассматривать как элемент двумерного массива
(матрицы), который расположен в сегменте данных со смещением от начала 006Dh. Регистр BX задает смещение строки от начала матрицы,
а регистр SI – смещение элемента относительно
начала строки. Таким образом, данная команда помещает в AL содержимое байта, расположенного по
адресу DS:BX + SI + 006Dh.
Форматы команд
Процессор
узнает о режимах адресации операндов команды из ее кода. Рассмотрим два
обобщенных формата команд, описывающих все рассмотренные режимы адресации.
Большинство двухадресных команд имеют такие форматы.
Формат команды, имеющий два операнда, один из которых
располагается в регистре, а другой в регистре или памяти. В общем случае такие команды могут
занимать от двух до четырех байт памяти. Весь этот массив байт разбит на поля,
каждое из которых несет определенную информацию (см. рис. 4).
Рис. 4. Формат двухадресной команды без непосредственной
адресации
Поля
формата имеют следующее применение:
– поле
code содержит код операции,
описывающий операцию, выполняемую командой (под это поле отводится 6 старших
бит нулевого байта кода команды);
– поле
d (первый бит нулевого байта кода)
определяет направление передачи результата:
1)
при d = 1 первый операнд определяется полем
reg, т.е. всегда является регистром,
а второй операнд определятся полем r/m, т.е. может быть ячейкой памяти или
регистром;
2)
при d = 0 – наоборот, первый
операнд определяется полем r/m, а второй – полем reg;
– поле
w (нулевой бит нулевого байта кода)
определяет размер операндов:
1)
при w = 0 – байты;
2)
при w = 1 – слова;
– поле
mod (два старших бита первого байта
кода) определяет режим адресации и, в частности, смысл поля r/m и существование полей disp_low и disp_high:
1)
при mod = 00 – поля disp_low и disp_high отсутствуют, а поле r/m определяет операнд в памяти;
2)
при mod = 01 – поле disp_high отсутствует, а поле r/m определяет операнд в памяти;
3)
при mod = 10 – оба поля disp_low и disp_high присутствуют в коде команды, а поле r/m определяет операнд в памяти;
4)
при mod = 11 – поле r/m определяет операнд в регистре, а поля disp_low и disp_high естественно отсутствуют;
– поле reg (пятый, четвертый и третий биты первого
байта кода) кодирует операнд располагаемый в регистре:
Поле reg
|
w = 0
|
w = 1
|
000
|
AL
|
AX
|
001
|
CL
|
CX
|
010
|
DL
|
DX
|
011
|
BL
|
BX
|
100
|
AH
|
SP
|
101
|
CH
|
BP
|
110
|
DH
|
SI
|
111
|
BH
|
DI
|
– поле r/m (младшие три бита первого байта кода) используется совместно с
полем mod:
1)
при значении поля mod = 11
поле r/m определяет операнд в регистре и кодирует
регистр так же как и поле reg (см. выше);
2) при
значении поля mod отличном от 11 поле r/m
определяет операнд в памяти и колирует режим адресации следующим образом:
Поле r/m
|
Режим адресации
|
Исполнительный адрес
|
000
|
Базово-индексная
|
BX + SI + disp
|
001
|
То же
|
BX + DI + disp
|
010
|
>>
|
BP
+ SI + disp
|
011
|
>>
|
BP
+ DI + disp
|
100
|
Косвенная или индексная
|
SI + disp
|
101
|
То же
|
DI + disp
|
110
|
Косвенная или по базе
|
BP
+ disp (при mod ¹ 00)
|
111
|
То же
|
BX + disp
|
Если поле mod
= 00 и поле r/m = 110, то исполнительный адрес операнда
определяется полями disp_low и disp_high, которые в данном случае
обязательно присутствуют в коде команды. Этот случай определяет прямую
адресацию;
– поля
disp_low и disp_high являются соответственно младшим и
старшим байтом компоненты исполнительного адреса (сдвига), присутствующей в
коде команды. Наличие этих полей в коде команды отличают базовую и индексную
адресацию от косвенной. Если в коде команды присутствует только поле disp_low, то при вычислении исполнительного адреса, оно расширяется до
слова, старший байт которого равен нулю.
Например,
команда MOV AL,[BX + DI + 3Fh] имеет код 8A413Fh. Выделим поля этого кода и удостоверимся, действительно это та
самая команда. Переведем код команды в двоичную систему счисления:
Выделим
поля кода команды:
code = 100010
– код операции пересылки (MOV);
d = 1
– первый операнд располагается в регистре (см. поле reg), а второй в регистре или памяти (см.
поле r/m);
w = 0
– операнды имеют размер в 1 байт;
mod = 01
– поле r/m определяет операнд в памяти и поле disp_high в коде команды отсутствует;
reg = 000
– при w = 0
это регистр AL;
r/m = 001 – при mod = 01 это ячейка памяти с исполнительным
адресом BX + DI + disp;
disp_low = 00111111 – младший байт компоненты сдвига
в исполнительном адресе операнда;
disp (сдвиг) = 00000000 00111111 –
получается расширением disp_low (в шестнадцатеричной системе это число 003Fh).
Таким
образом, приходим к выводу, что это код команды
mov AL,[BX + DI + 003Fh].
Формат команды, имеющий два операнда, один из которых
располагается в регистре или памяти, а другой непосредственно в коде команды. Этот формат применяется для
команд, один из операндов которых имеет непосредственную адресацию (см. рис. 5).
Длина кода этого формата от 3 до 6 байт.
Байт
|
0
|
1
|
2
|
3
|
4
|
5
|
Бит
|
7…2
|
1
|
0
|
76
|
543
|
210
|
7……0
|
7……0
|
7……0
|
7……0
|
Поле
|
code
|
s
|
w
|
mod
|
reg
|
r/m
|
disp_low
|
disp_high
|
data_low
|
data_high
|
Рис. 5. Формат двухадресной команды, второй операнд которой имеет
непосредственную адресацию
Поля формата имеют следующее применение:
– поле
code вместе с reg, а иногда и с s, определяет выполняемую операцию;
– поле
s вместе с полем w определяет размер второго операнда и, тем
самым, наличие поля data_high:
1)
при s = 0 размер второго
операнда определяется полем w;
2)
при s = 1 размер второго
операнда равен 1 байту, причем при w = 1
этот байт расширяется до слова путем размножения старшего разряда младшего
байта в старший байт;
– поле
w определяет размер первого операнда:
1)
при w = 0 – байт;
2)
при w = 1 – слово;
– поля
mod и r/m используются как в рассмотренном ранее формате;
– поле
reg является частью кода операции;
– поля
disp_low и disp_high используются как в рассмотренном
ранее формате (в частности могут отсутствовать);
– поля
data_low и data_high – соответственно младший и
старший байт непосредственного (второго) операнда (поле data_high может отсутствовать).
GЗадание 1. В соответствии со своим вариантом опробовать в debug и пояснить команды. Осуществить ассемблирование и
дизассемблирование указанных преподавателем команд.
Варианты заданий
1.
|
MOV BX,100
MOV BP,[BX]
MOV DX,[BP + 2]
MOV AX,DX
ADD AX,[BX + 4]
|
2.
|
MOV AX,200
ADD AX,[BX]
MOV DI,AX
SUB AX,[BX + DI + 2]
CMP AX,[DI]
|
3.
|
MOV DI,4
MOV BX,100
MOV AX,[BX + DI + 4]
MOV CL,AL
SUB CX,[BX + SI]
|
4.
|
MOV BP,70
ADC BP,[BP]
MOV AX,BX
ADD AX,[BP + 7]
MOV DX,[BP + 4]
|
5.
|
MOV AX,200
MOV BX,AX
MOV BX,[BX + 4]
MOV CX,[BX + 6]
MOV DX,[BX + 8]
|
6.
|
ADD BX,[BX
+ 2]
MOV DI,8
MOV DX,[BX + DI + 8]
SUB BX,DX
MOV AX,[DI]
|
7.
|
MOV BX,18
MOV AX,[BX + 200]
INC BX
MOV DI,BX
MOV DX,[BX + DI + 1E]
|
8.
|
MOV AX,DX
MOV SI,AX
ADC AX,[SI]
MOV BP,AX
AND AX,[BP + 10]
|
9.
|
MOV BP,40
MOV BX,[BP + 2]
MOV AX,[BX + DI + 2]
MOV CX,AX
MOV DX,[DI]
|
10.
|
OR AX,[BX +
DI – 14]
ADD BX,AX
MOV DX,[BX]
MOV BX,[DI]
SUB AX,[BX + 8]
|
|
|
|
|
11.
|
MOV AX,100
ADD AX,[BX]
MOV DI,AX
SUB AX,[BX + DI + 2]
CMP AX,[DI]
|
12.
|
MOV BX,60
MOV BP,[BX]
MOV DX,[BP + 2]
MOV AX,DX
ADD AX,[BX + 4]
|
13.
|
MOV AX,200
ADD AX,[BX]
MOV DI,AX
SUB AX,[BX + DI + 2]
CMP AX,[DI]
|
14.
|
MOV DI,80
MOV BX,100
MOV AX,[BX + DI + 4]
MOV CL,AL
SUB CX,[BX + SI]
|
Контрольные вопросы:
1.
Организация
взаимодействия процессора и оперативной памяти?
2.
Как записывается логический адрес?
3.
Какие режимы адресации существуют?
4.
Формат команд?
5.
Формирование физического адреса?
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.