- •Содержание
- •Задание
- •Разработка архитектуры внешних выводов
- •Выбор форматов данных
- •Определение модели памяти и структуры регистровой памяти
- •Выбор форматов команд
- •Разработка системы команд
- •Внутренняя организация
- •Структурно-функциональная схема процессора
- •Основные алгоритмы функционирования
- •Алгоритмы выполнения отдельных операций
- •Разработка алгоритмов выполнения основных операций на шине
- •Список использованной литературы
Выбор форматов команд
Способы адресации
Непосредственная.
КОП |
Операнд |
Относительная.
КОП |
База |
Индекс |
Смещение |
Прямая.
КОП |
Исполнительный адрес |
Формат команд
Согласно заданию команды имеют максимальную адресность – 3.
Команды делятся на несколько типов:
Арифметические команды.
КОП |
R1 |
R2 |
… |
Логические команды.
КОП |
R1 |
[R2] |
… |
Команды работы с памятью.
КОП |
R1, [Addr] |
Addr, [R2] |
… |
Переходы.
КОП |
Addr, [R1], {R1} |
[Addr], {R2} |
{Addr} |
Специальные.
КОП |
R1, [Addr] |
R2, [Addr] |
… |
Разработка системы команд
№ |
Мнемоника |
Название |
Содержание |
Флаги |
Код | |||||||
Z |
C |
S |
O |
I |
T |
U |
| |||||
Арифметические операции с целыми числами | ||||||||||||
1 |
ADD |
Сложение |
R1<=R1+R2 |
+ |
+ |
+ |
+ |
- |
- |
- |
000001 | |
2 |
ADDC |
Сложение с учетом переноса |
R1<=R1+R2+C |
+ |
+ |
+ |
+ |
- |
- |
- |
000010 | |
3 |
SUB |
Вычитание |
R1<=R1-R2 |
+ |
+ |
+ |
+ |
- |
- |
- |
000011 | |
4 |
SUBC |
Вычитание с учетом переноса |
R1<=R1-R2-C |
+ |
+ |
+ |
+ |
- |
- |
- |
000100 | |
Логические операции | ||||||||||||
5 |
AND |
Поразрядное «И» |
R1<=R1&R2 |
+ |
- |
+ |
- |
- |
- |
- |
000101 | |
6 |
OR |
Поразрядное «ИЛИ» |
R1<=R1|R2 |
+ |
- |
+ |
- |
- |
- |
- |
000110 | |
7 |
XOR |
Поразрядное «Исключающее ИЛИ» |
R1<=R1xorR2 |
+ |
- |
+ |
- |
- |
- |
- |
000111 | |
8 |
CPL |
Инверсия |
R1<=~R1 |
+ |
- |
+ |
- |
- |
- |
- |
001000 | |
9 |
SLL |
Логический сдвиг влево |
|
+ |
+ |
+ |
- |
- |
- |
- |
001001 | |
10 |
SRL |
Логический сдвиг вправо |
|
+ |
+ |
+ |
- |
- |
- |
- |
001010 | |
11 |
SRA |
Арифметический сдвиг вправо |
|
+ |
+ |
+ |
- |
- |
- |
- |
001011 | |
Команды работы с памятью | ||||||||||||
12 |
LDDW |
Загрузка двойного слова |
R1<=<R2> |
+ |
- |
+ |
- |
- |
- |
- |
001100 | |
13 |
LDW |
Загрузка слова |
R1<=<R2> |
+ |
- |
+ |
- |
- |
- |
- |
001101 | |
14 |
LDH |
Загрузка полуслова |
R1<=<R2> |
+ |
- |
+ |
- |
- |
- |
- |
001110 | |
15 |
LDB |
Загрузка байта |
R1<=<R2> |
+ |
- |
+ |
- |
- |
- |
- |
001111 | |
16 |
STDW |
Запись двойного слова |
R1<=<R2> |
- |
- |
- |
- |
- |
- |
- |
010000 | |
17 |
STW |
Запись слова |
R1<=<R2> |
- |
- |
- |
- |
- |
- |
- |
010001 | |
18 |
STH |
Запись полуслова |
R1<=<R2> |
- |
- |
- |
- |
- |
- |
- |
010010 | |
19 |
STB |
Запись байта |
R1<=<R2> |
- |
- |
- |
- |
- |
- |
- |
010011 | |
Переходы | ||||||||||||
20 |
JMP |
Безусловный переход |
PC<=<R1>+R2 |
- |
- |
- |
- |
- |
- |
- |
010100 | |
21 |
JZ |
Переход по нулю |
PC<=<R1>+R2 |
- |
- |
- |
- |
- |
- |
- |
010101 | |
22 |
JNZ |
Переход не по нулю |
PC<=<R1>+R2 |
- |
- |
- |
- |
- |
- |
- |
010110 | |
23 |
JO |
Переход по переполнению |
PC<=<R1>+R2 |
- |
- |
- |
- |
- |
- |
- |
010111 | |
24 |
JNO |
Переход не по переполнению |
PC<=<R1>+R2 |
- |
- |
- |
- |
- |
- |
- |
011000 | |
25 |
JC |
Переход по переносу |
PC<=<R1>+R2 |
- |
- |
- |
- |
- |
- |
- |
011001 | |
26 |
JNC |
Переход не по переносу |
PC<=<R1>+R2 |
- |
- |
- |
- |
- |
- |
- |
011010 | |
27 |
JE |
Переход, если равны |
PC<=<R1>+R3 |
- |
- |
- |
- |
- |
- |
- |
011011 | |
28 |
JNE |
Переход, если не равны |
PC<=<R1>+R3 |
- |
- |
- |
- |
- |
- |
- |
011100 | |
Специальные | ||||||||||||
29 |
CALL |
Вызов процедуры |
<SP><=PC PC<=<R1>+R2 |
- |
- |
- |
- |
- |
- |
- |
011101 | |
30 |
RET |
Возврат из процедуры |
<PC><=SP |
- |
- |
- |
- |
- |
- |
- |
011110 | |
31 |
MOV |
Запись в регистр значения |
R1<=R2 |
+ |
- |
+ |
- |
- |
- |
- |
011111 | |
32 |
MOVI |
Запись в регистр значения |
R1<=<R2> |
+ |
- |
+ |
- |
- |
- |
- |
100000 | |
33 |
NOP |
Нет операции |
PC<=PC+1 |
- |
- |
- |
- |
- |
- |
- |
000000 | |
34 |
IN |
Ввод из порта |
R1<=<R2> |
+ |
- |
+ |
- |
- |
- |
- |
100001 | |
35 |
OUT |
Вывод в порт |
<R1><=R2 |
- |
- |
- |
- |
- |
- |
- |
100010 | |
36 |
INT |
Вызов прерывания |
<SP><=PC |
- |
- |
- |
- |
+ |
+ |
+ |
100011 | |
37 |
RETI |
Возврат из прерывания |
<PC><=SP |
- |
- |
- |
- |
- |
- |
- |
100100 | |
38 |
HALT |
Ожидание прерывания |
|
- |
- |
- |
- |
- |
- |
- |
100101 | |
39 |
SU |
Переход в режим суперпользователя |
|
- |
- |
- |
- |
- |
- |
- |
100110 | |
40 |
RETU |
Возврат в режим пользователя |
|
- |
- |
- |
- |
- |
- |
- |
100111 | |
41 |
LFLG |
Загрузка регистра флагов |
R1<=Flags |
- |
- |
- |
- |
- |
- |
- |
101000 | |
42 |
SFLG |
Запись регистра флагов |
Flags<=R1 |
- |
- |
- |
- |
+ |
+ |
+ |
101001 | |
Арифметические операции с числами в форме с плавающей точкой | ||||||||||||
43 |
FADD |
Сложение |
F1<=F1+F2 |
+ |
- |
+ |
+ |
- |
- |
- |
101010 | |
44 |
FSUB |
Вычитание |
F1<=F1-F2 |
+ |
- |
+ |
+ |
- |
- |
- |
101011 | |
45 |
FMUL |
Умножение |
F1<=F1*F2 |
+ |
- |
+ |
+ |
- |
- |
- |
101100 | |
46 |
FDIV |
Деление |
F1<=F1/F2 |
+ |
- |
+ |
+ |
- |
- |
- |
101101 | |
47 |
FMOV |
Обмен между регистрами |
F1<=F2 |
+ |
- |
+ |
- |
- |
- |
- |
101110 | |
48 |
FRLD |
Загрузка регистров |
F1<=R1 |
+ |
- |
+ |
- |
- |
- |
- |
101111 | |
49 |
FRST |
Запись из регистров |
R1<=F1 |
+ |
- |
+ |
- |
- |
- |
- |
110000 |
Полученная система команд является функциональной полностью и включает следующие наборы команд:
Обращения к памяти по чтению и записи;
Целочисленные арифметические для чисел (сложение, вычитание, с учетом и без учета переноса, сравнение);
Арифметические с плавающей точкой (сложение, вычитание, умножение, деление);
Логические (поразрядные «И», «ИЛИ», «Исключающее ИЛИ», инверсия);
Сдвигов на 1 бит;
Условных и безусловных переходов;
Работы с подпрограммами;
Загрузки в регистры непосредственно операндов;
Ввода-вывода;
Управления вычислительным процессом.
В данной архитектуре специально не использованы некоторые команды. Например, целочисленное умножение, деление, сравнение с ПТ, сдвиги на произвольное число тактов. Сделано это так, поскольку мы разрабатываем RISCпроцессор и для реализации этих команд потребуется написание несложных подпрограмм на основе реализованных команд. Эти подпрограммы можно как возложить на программиста, так и внести их в специальное хранилище этих подпрограмм и за счет этого получить расширенный набор команд.
Учитывая таблицу с командами и вышеописанный факт, можно однозначно сказать, что система команд – полнофункциональна.