МПС 3 курс Практические задания Пример решения задачи по адресации - BysonHunter/Tavrich_college GitHub Wiki
🏠 Главная · Микропроцессорные системы · 3 курс · Практические работы по МДК.02.01 «Микропроцессорные системы»
Пример решения задачи по способам адресации
Условие задачи
В аккумуляторе процессора ACC находится число 6
$$ ACC = 6_{10} = 0000,0110_2. $$
Необходимо прибавить к нему число 10
$$ X = 10_{10} = 0000,1010_2, $$
используя разные способы адресации операнда.
Для примеров примем следующие исходные данные:
| Параметр | Десятичное значение | Двоичное значение |
|---|---|---|
| Адрес ячейки памяти с числом 10 | 15 | 0000000000001111 |
| Номер используемого регистра | 2 | 010 |
| Содержимое индексного регистра $R_2$ | 3 | 00000011 |
| Значение счётчика команд $PC$ | 4 | 0000000000000100 |
В примере принята следующая организация:
- регистры общего назначения и аккумулятор — 8-разрядные;
- адрес памяти — 16-разрядный;
- один байт данных — 8 бит;
- 16-разрядный адрес в регистровых операциях хранится в паре 8-разрядных регистров: старший байт и младший байт;
- счётчик команд $PC$ — отдельный 16-разрядный специальный регистр; он не входит в набор 8-разрядных регистров общего назначения
000–111.
Во всех таблицах восемь регистров общего назначения пронумерованы трёхразрядными двоичными кодами от 000 до 111. Ячейки памяти перечислены последовательно от 16-разрядного адреса 0000 0000 0000 0000 до необходимого адреса 0000 0000 0000 1111. Неиспользуемые регистры и ячейки содержат произвольные 8-разрядные комбинации нулей и единиц; на выполнение рассматриваемой команды они не влияют.
Обозначения цветовых маркеров в таблицах:
- 🟦 синий — регистр или ячейка-указатель, участвующие в формировании адреса;
- 🟩 зелёный — ячейка памяти, содержащая операнд;
- 🟨 жёлтый — вычисленный адрес, полученный операнд и результат операции.
Обозначения:
- $A_{\text{исп}}$ — исполнительный (эффективный) адрес операнда;
- $A_{\text{б}}$ — базовый адрес;
- $d$ — смещение;
- $M[A]$ — содержимое ячейки памяти с адресом $A$;
- $R_i$ — регистр процессора с номером $i$;
- $PC$ — счётчик команд;
- $ACC$ — аккумулятор;
КОП— код операции.
Во всех случаях должна быть выполнена одна и та же операция:
$$ ACC \leftarrow ACC + X. $$
1. Непосредственная адресация
При непосредственной адресации значение операнда находится непосредственно в команде.
| КОП | 8-разрядный операнд |
|---|---|
| СЛЖ | 00001010 |
Операнд:
$$ X = 0000,1010_2 = 10_{10}. $$
Обращение к памяти за операндом не требуется.
| Регистры процессора | Ячейки оперативной памяти | Слагаемое | Аккумулятор | |||
|---|---|---|---|---|---|---|
| Номер регистра, 3 бита | Данные, 8 бит | Адрес, 16 бит | Данные, 8 бит | Исполнительный адрес | Значение, 8 бит | $ACC$ |
000 |
10000000 |
0000000000000000 |
00101000 |
— | 🟨 00001010 |
🟨 0000 0110 + 0000 1010 = 0001 0000 |
001 |
11011111 |
0000000000000001 |
01100111 |
— | — | — |
010 |
10110010 |
0000000000000010 |
10011010 |
— | — | — |
011 |
01101001 |
0000000000000011 |
00110001 |
— | — | — |
100 |
10110100 |
0000000000000100 |
11011100 |
— | — | — |
101 |
10000011 |
0000000000000101 |
10001011 |
— | — | — |
110 |
00000110 |
0000000000000110 |
01101110 |
— | — | — |
111 |
10101101 |
0000000000000111 |
11110101 |
— | — | — |
| — | — | 0000000000001000 |
11010000 |
— | — | — |
| — | — | 0000000000001001 |
11101111 |
— | — | — |
| — | — | 0000000000001010 |
10000010 |
— | — | — |
| — | — | 0000000000001011 |
11111001 |
— | — | — |
| — | — | 0000000000001100 |
00000100 |
— | — | — |
| — | — | 0000000000001101 |
10010011 |
— | — | — |
| — | — | 0000000000001110 |
11010110 |
— | — | — |
| — | — | 0000000000001111 |
00111101 |
— | — | — |
2. Прямая адресация
При прямой адресации в адресном поле команды непосредственно указан адрес операнда.
| КОП | 16-разрядный адрес |
|---|---|
| СЛЖ | 0000000000001111 |
Исполнительный адрес:
$$ A_{\text{исп}} = 0000,0000,0000,1111_2 = 15_{10}. $$
В памяти должно находиться:
$$ M[15] = 0000,1010_2. $$
| Регистры процессора | Ячейки оперативной памяти | Слагаемое | Аккумулятор | |||
|---|---|---|---|---|---|---|
| Номер регистра, 3 бита | Данные, 8 бит | Адрес, 16 бит | Данные, 8 бит | Исполнительный адрес | Значение, 8 бит | $ACC$ |
000 |
10100001 |
0000000000000000 |
01101001 |
— | — | — |
001 |
10001100 |
0000000000000001 |
10110100 |
— | — | — |
010 |
01111011 |
0000000000000010 |
10000011 |
— | — | — |
011 |
10011110 |
0000000000000011 |
00000110 |
— | — | — |
100 |
01100101 |
0000000000000100 |
10101101 |
— | — | — |
101 |
10000000 |
0000000000000101 |
00101000 |
— | — | — |
110 |
11011111 |
0000000000000110 |
01100111 |
— | — | — |
111 |
10110010 |
0000000000000111 |
10011010 |
— | — | — |
| — | — | 0000000000001000 |
00110001 |
— | — | — |
| — | — | 0000000000001001 |
11011100 |
— | — | — |
| — | — | 0000000000001010 |
10001011 |
— | — | — |
| — | — | 0000000000001011 |
01101110 |
— | — | — |
| — | — | 0000000000001100 |
11110101 |
— | — | — |
| — | — | 0000000000001101 |
11010000 |
— | — | — |
| — | — | 0000000000001110 |
11101111 |
— | — | — |
| — | — | 🟩 0000000000001111 |
🟩 00001010 |
🟨 0000000000001111 |
🟨 00001010 |
🟨 0000 0110 + 0000 1010 = 0001 0000 |
3. Регистровая адресация
При регистровой адресации команда содержит номер регистра, в котором находится операнд.
| КОП | Регистр |
|---|---|
| СЛЖ | 010 ($R_2$) |
Перед выполнением команды:
$$ R_2 = 0000,1010_2. $$
Операнд считывается непосредственно из $R_2$; обращение к памяти данных не требуется.
| Регистры процессора | Ячейки оперативной памяти | Слагаемое | Аккумулятор | |||
|---|---|---|---|---|---|---|
| Номер регистра, 3 бита | Данные, 8 бит | Адрес, 16 бит | Данные, 8 бит | Исполнительный адрес | Значение, 8 бит | $ACC$ |
000 |
11000010 |
0000000000000000 |
10101010 |
— | — | — |
001 |
00111001 |
0000000000000001 |
00000001 |
— | — | — |
🟦 010 |
🟦 00001010 |
0000000000000010 |
01101100 |
— | 🟨 00001010 |
🟨 0000 0110 + 0000 1010 = 0001 0000 |
011 |
11010011 |
0000000000000011 |
11011011 |
— | — | — |
100 |
00010110 |
0000000000000100 |
01111110 |
— | — | — |
101 |
01111101 |
0000000000000101 |
11000101 |
— | — | — |
110 |
10111000 |
0000000000000110 |
01100000 |
— | — | — |
111 |
10110111 |
0000000000000111 |
00111111 |
— | — | — |
| — | — | 0000000000001000 |
10010010 |
— | — | — |
| — | — | 0000000000001001 |
11001001 |
— | — | — |
| — | — | 0000000000001010 |
10010100 |
— | — | — |
| — | — | 0000000000001011 |
11100011 |
— | — | — |
| — | — | 0000000000001100 |
11100110 |
— | — | — |
| — | — | 0000000000001101 |
00001101 |
— | — | — |
| — | — | 0000000000001110 |
00001000 |
— | — | — |
| — | — | 0000000000001111 |
11000111 |
— | — | — |
4. Косвенная регистровая адресация
При косвенной регистровой адресации команда задаёт пару 8-разрядных регистров, содержащую 16-разрядный адрес операнда. В примере $R_2$ хранит старший байт, а $R_3$ — младший.
| КОП | Пара регистров |
|---|---|
| СЛЖ | 010:011 ($R_2:R_3$) |
Пусть:
$$ R_2 = 0000,0000_2, \qquad R_3 = 0000,1111_2. $$
Тогда:
$$ A_{\text{исп}} = R_2:R_3 = 0000,0000,0000,1111_2 = 15_{10}, $$
$$ X = M[A_{\text{исп}}] = M[15] = 0000,1010_2. $$
| Регистры процессора | Ячейки оперативной памяти | Слагаемое | Аккумулятор | |||
|---|---|---|---|---|---|---|
| Номер регистра, 3 бита | Данные, 8 бит | Адрес, 16 бит | Данные, 8 бит | Исполнительный адрес | Значение, 8 бит | $ACC$ |
000 |
11100011 |
0000000000000000 |
11101011 |
— | — | — |
001 |
11100110 |
0000000000000001 |
01001110 |
— | — | — |
🟦 010 |
🟦 00000000 — старший байт адреса |
0000000000000010 |
01010101 |
— | — | — |
🟦 011 |
🟦 00001111 — младший байт адреса |
0000000000000011 |
10110000 |
— | — | — |
100 |
11000111 |
0000000000000100 |
01001111 |
— | — | — |
101 |
01111010 |
0000000000000101 |
01100010 |
— | — | — |
110 |
10010001 |
0000000000000110 |
01011001 |
— | — | — |
111 |
10111100 |
0000000000000111 |
11100100 |
— | — | — |
| — | — | 0000000000001000 |
11110011 |
— | — | — |
| — | — | 0000000000001001 |
10110110 |
— | — | — |
| — | — | 0000000000001010 |
10011101 |
— | — | — |
| — | — | 0000000000001011 |
01011000 |
— | — | — |
| — | — | 0000000000001100 |
11010111 |
— | — | — |
| — | — | 0000000000001101 |
01001010 |
— | — | — |
| — | — | 0000000000001110 |
00100001 |
— | — | — |
| — | — | 🟩 0000000000001111 |
🟩 00001010 |
🟨 0000000000001111 |
🟨 00001010 |
🟨 0000 0110 + 0000 1010 = 0001 0000 |
5. Индексная адресация
При индексной адресации исполнительный адрес образуется сложением адресной части команды и содержимого индексного регистра:
$$ A_{\text{исп}} = A_{\text{б}} + R_i. $$
Для заданных значений $A_{\text{исп}}=15$ и $R_2=3$ найдём адресную часть команды:
$$ A_{\text{б}} = A_{\text{исп}} - R_2 = 15 - 3 = 12. $$
В двоичном виде:
$$ 0000,0000,0000,1100_2 + 0000,0000,0000,0011_2 = 0000,0000,0000,1111_2. $$
Команда содержит номер индексного регистра $R_2$ и 16-разрядный базовый адрес 0000 0000 0000 1100:
| КОП | Индексный регистр | 16-разрядный базовый адрес |
|---|---|---|
| СЛЖ | 010 ($R_2$) |
0000000000001100 |
Следовательно:
$$ A_{\text{исп}} = 12 + 3 = 15, $$
$$ X = M[15] = 0000,1010_2. $$
| Регистры процессора | Ячейки оперативной памяти | Слагаемое | Аккумулятор | |||
|---|---|---|---|---|---|---|
| Номер регистра, 3 бита | Данные, 8 бит | Адрес, 16 бит | Данные, 8 бит | Исполнительный адрес | Значение, 8 бит | $ACC$ |
000 |
00100101 |
0000000000000000 |
01101101 |
— | — | — |
001 |
01000000 |
0000000000000001 |
11101000 |
— | — | — |
🟦 010 |
🟦 00000011 — индекс |
0000000000000010 |
00100111 |
— | — | — |
011 |
01110010 |
0000000000000011 |
01011010 |
— | — | — |
100 |
00101001 |
0000000000000100 |
11110001 |
— | — | — |
101 |
01110100 |
0000000000000101 |
10011100 |
— | — | — |
110 |
01000011 |
0000000000000110 |
01001011 |
— | — | — |
111 |
11000110 |
0000000000000111 |
00101110 |
— | — | — |
| — | — | 0000000000001000 |
10110101 |
— | — | — |
| — | — | 0000000000001001 |
10010000 |
— | — | — |
| — | — | 0000000000001010 |
10101111 |
— | — | — |
| — | — | 0000000000001011 |
01000010 |
— | — | — |
| — | — | 0000000000001100 |
10111001 |
— | — | — |
| — | — | 0000000000001101 |
11000100 |
— | — | — |
| — | — | 0000000000001110 |
01010011 |
— | — | — |
| — | — | 🟩 0000000000001111 |
🟩 00001010 |
🟨 0000000000001111 |
🟨 00001010 |
🟨 0000 0110 + 0000 1010 = 0001 0000 |
6. Относительная адресация
При относительной адресации адрес операнда вычисляется как сумма значения 16-разрядного счётчика команд $PC$ и знакового смещения, указанного в команде:
$$ A_{\text{исп}} = PC + d. $$
В реальном процессоре за основу обычно принимается значение $PC$, соответствующее адресу текущей или следующей команды. Конкретное правило определяется архитектурой процессора.
В учебном примере примем $PC=4$ и $A_{\text{исп}}=15$. Тогда:
$$ d = A_{\text{исп}} - PC = 15 - 4 = 11. $$
В двоичном виде (после расширения смещения до 16 разрядов):
$$ 0000,0000,0000,0100_2 + 0000,0000,0000,1011_2 = 0000,0000,0000,1111_2. $$
| КОП | 8-разрядное смещение |
|---|---|
| СЛЖ | 00001011 |
Счётчик команд приводится отдельно от регистров общего назначения:
| Специальный регистр | Данные, 16 бит |
|---|---|
| 🟦 $PC$ | 🟦 0000000000000100 |
Следовательно:
$$ A_{\text{исп}} = 4 + 11 = 15, $$
$$ X = M[15] = 0000,1010_2. $$
В примере используется 8-разрядное знаковое смещение. Его диапазон — от $-128$ до $+127$, поэтому значение $+11$ представимо как
0000 1011.
| Регистры процессора | Ячейки оперативной памяти | Слагаемое | Аккумулятор | |||
|---|---|---|---|---|---|---|
| Номер регистра, 3 бита | Данные, 8 бит | Адрес, 16 бит | Данные, 8 бит | Исполнительный адрес | Значение, 8 бит | $ACC$ |
000 |
01000110 |
0000000000000000 |
10101110 |
— | — | — |
001 |
11101101 |
0000000000000001 |
00110101 |
— | — | — |
010 |
01101000 |
0000000000000010 |
00010000 |
— | — | — |
011 |
10100111 |
0000000000000011 |
00101111 |
— | — | — |
100 |
11011010 |
0000000000000100 |
11000010 |
— | — | — |
101 |
01110001 |
0000000000000101 |
00111001 |
— | — | — |
110 |
00011100 |
0000000000000110 |
01000100 |
— | — | — |
111 |
11001011 |
0000000000000111 |
11010011 |
— | — | — |
| — | — | 0000000000001000 |
00010110 |
— | — | — |
| — | — | 0000000000001001 |
01111101 |
— | — | — |
| — | — | 0000000000001010 |
10111000 |
— | — | — |
| — | — | 0000000000001011 |
10110111 |
— | — | — |
| — | — | 0000000000001100 |
10101010 |
— | — | — |
| — | — | 0000000000001101 |
00000001 |
— | — | — |
| — | — | 0000000000001110 |
01101100 |
— | — | — |
| — | — | 🟩 0000000000001111 |
🟩 00001010 |
🟨 0000000000001111 |
🟨 00001010 |
🟨 0000 0110 + 0000 1010 = 0001 0000 |
7. Косвенная адресация через память
При косвенной адресации адресное поле команды указывает на ячейку памяти, в которой хранится адрес операнда.
Данный вид адресации применяется очень редко и во многих процессорах отсутствует команды, реализующие данный способ адресации.
| КОП | 16-разрядный адрес указателя |
|---|---|
| СЛЖ | 0000000000000010 |
Пусть старший байт адреса хранится в $M[2]$, а младший — в $M[3]$:
$$ M[2:3] = 0000,0000,0000,1111_2 = 15_{10}. $$
Тогда исполнительный адрес определяется в два этапа:
$$ A_{\text{исп}} = M[2:3] = 15, $$
$$ X = M[A_{\text{исп}}] = M[15] = 0000,1010_2. $$
Для получения операнда выполняются три чтения байтов из памяти: два чтения формируют 16-разрядный адрес, третье возвращает операнд.
| Регистры процессора | Ячейки оперативной памяти | Слагаемое | Аккумулятор | |||
|---|---|---|---|---|---|---|
| Номер регистра, 3 бита | Данные, 8 бит | Адрес, 16 бит | Данные, 8 бит | Исполнительный адрес | Значение, 8 бит | $ACC$ |
000 |
00000100 |
0000000000000000 |
00101100 |
— | — | — |
001 |
10010011 |
0000000000000001 |
10011011 |
— | — | — |
010 |
11010110 |
🟦 0000000000000010 |
🟦 00000000 — старший байт адреса |
— | — | — |
011 |
00111101 |
🟦 0000000000000011 |
🟦 00001111 — младший байт адреса |
— | — | — |
100 |
01111000 |
0000000000000100 |
00100000 |
— | — | — |
101 |
01110111 |
0000000000000101 |
11111111 |
— | — | — |
110 |
01101010 |
0000000000000110 |
01010010 |
— | — | — |
111 |
11000001 |
0000000000000111 |
10001001 |
— | — | — |
| — | — | 0000000000001000 |
01010100 |
— | — | — |
| — | — | 0000000000001001 |
10100011 |
— | — | — |
| — | — | 0000000000001010 |
10100110 |
— | — | — |
| — | — | 0000000000001011 |
11001101 |
— | — | — |
| — | — | 0000000000001100 |
11001000 |
— | — | — |
| — | — | 0000000000001101 |
10000111 |
— | — | — |
| — | — | 0000000000001110 |
00111010 |
— | — | — |
| — | — | 🟩 0000000000001111 |
🟩 00001010 — операнд |
🟨 0000000000001111 |
🟨 00001010 |
🟨 0000 0110 + 0000 1010 = 0001 0000 |
Выполнение сложения
Независимо от способа получения второго операнда арифметическая операция одинакова:
$$ \begin{aligned} 0000,0110_2 + 0000,1010_2 &= 0001,0000_2,\ 6_{10} + 10_{10} &= 16_{10}. \end{aligned} $$
Результат полностью помещается в 8-разрядный аккумулятор:
$$ ACC = 0001,0000_2, \qquad C = 0. $$
Сводная таблица
| Способ адресации | Что находится в команде | Где находится операнд 1010 |
Число обращений к памяти данных* |
|---|---|---|---|
| Непосредственная | Сам операнд 00001010 |
В команде | 0 |
| Прямая | Адрес 0000000000001111 |
$M[15]$ | 1 |
| Регистровая | Номер регистра $R_2$ | $R_2$ | 0 |
| Косвенная регистровая | Пара $R_2:R_3$ | $M[R_2:R_3]$, где $R_2:R_3=15$ | 1 |
| Косвенная через память | Адрес указателя 0000000000000010 |
$M[M[2:3]]$, где $M[2:3]=15$ | 3 |
| Индексная | $R_2$ и базовый адрес 0000000000001100 |
$M[12+R_2]$, где $R_2=3$ | 1 |
| Относительная | Смещение 00001011 |
$M[PC+11]$, где $PC=4$ | 1 |
* Учитываются только обращения, необходимые для получения операнда; выборка самой команды не учитывается.