МПС 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

* Учитываются только обращения, необходимые для получения операнда; выборка самой команды не учитывается.


← дополнительно

Оригинал материала на GitHub