Данному образовательному сайту пришлось несколько раз менять свое имя. С 2022 года доступ к нему обеспечивается по URL
emc.orgfree.com

emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-2021) ==> emc.orgfree.com (2022-...)
Более подробно об истории сайта можно прочитать здесь.


Учебные модели компьютера



Модели (software):

"Е14" (parallel !!!)
"S9PU" (parallel)

Модели (hardware):






Награды сайта
Награды сайта 2005

Учебная модель fN8: таблица команд

В таблице приняты следующие обозначения:

Acc – содержимое аккумулятора;
DD – содержимое ячейки памяти или непосредственный операнд;
R – содержимое регистра общего назначения R;
R* – содержимое регистра или косвенно адресуемой через регистр ячейки памяти;
p – префикс перед именем регистра, определяющий способ адресации;
A – адрес ячейки памяти данных;
M(A) – содержимое ячейки памяти данных по адресу A;
C – флаг PSW[4] переноса(заёма)
SPL – содержимое указателя стека;
L – адрес перехода (метка или абсолютный);
CR – содержимое регистра команд;
RIO - содержимое регистра внешнего устройства;
a - номер (адрес) регистра внешнего устройства;
b - номер бита в байте.

Таблица 1 - Система команд

МнемокодНазваниеДействия Флаги
OCANZ
Безадресные команды [Код 0]
NOPНет операцииPCL := PCL + 1
-----
RETВозврат из подпрограммыPCL := M(SS.SPL); Inc(SPL);
CS := M(SS.SPL)[1:0]; Inc(SPL)
-----
IRETВозврат из прерыванияPCL := M(SS.SPL); Inc(SPL);
PSW[5:0].CS := M(SS.SPL);
Inc(SPL)
-----
EIРазрешить прерываниеFI := 1
-----
DIЗапретить прерываниеFI := 0
-----
RRСдвиг аккумулятора правый циклический Acc[7:0] := Acc[0].Acc[7:1];
FC := Acc[0]
-----
RLСдвиг аккумулятора левый циклический Acc[7:0] := Acc[6:0].Acc[7];
FC := Acc[7]
-----
RRCСдвиг аккумулятора правый циклический через перенос Acc[7:0] := FC.Acc[7:1];
FC := Acc[0]
-----
RLCСдвиг аккумулятора левый циклический через перенос Acc[7:0] := Acc[6:0].FC;
FC := Acc[7]
-----
NOTAИнверсия аккумулятораAcc := NOT Acc
000++
INCAИнкремент аккумулятораAcc := Acc + 1
-++++
DECAДекремент аккумулятораAcc := Acc - 1
-++++
SWAPAОбмен тетрадами аккумулятора Acc[7:4] <==> Acc[3:0]
-----
DAAДесятичная коррекция сложения (см. комментарий
после таблицы)
-++++
DSAДесятичная коррекция вычитания (см. комментарий
после таблицы)
-++++
MOVSPЗагрузка SPLSPL := Acc
-----
MOVAPSWПрочитать PSWAcc := PSW
-----
MOVASRПрочитать SRAcc := SR
-----
MOVSRAЗагрузить SRSR := Acc
-----
HLTСтопПрекратить командные циклы
-----
Цикл [Код 1]
DJRNZ Rc, L Цикл (Rc - один из регистров {R0, R1, R2, R3}) Rc := Rc - 1;
if Rc <> 0 then goto L
-----
Команды условных переходов [Код 2 or 3]
JNZ LПереход, если не ноль if Z=0 then CS.PCL := CR[9:0]
-----
JNC LПереход, если не перенос if C=0 then CS.PCL := CR[9:0]
-----
JNN LПереход, если не отрицательно if N=0 then CS.PCL := CR[9:0]
-----
JNO LПереход, если не переполнение if O=0 then CS.PCL := CR[9:0]
-----
JZ LПереход, если ноль if Z=1 then CS.PCL := CR[9:0]
-----
JC LПереход, если перенос if C=1 then CS.PCL := CR[9:0]
-----
JN LПереход, если отрицательно if N=1 then CS.PCL := CR[9:0]
-----
JO LПереход, если переполнение if O=1 then CS.PCL := CR[9:0]
-----
Команды безусловной передачи управления [Код 4]
JMP LБезусловный переход CS.PCL := CR[9:0]
-----
CALL LВызов подпрограммы Dec(SPL);
M(SS.SPL)[1:0] := CS;
Dec(SPL); M(SS.SPL) := PCL;
CS.PCL := CR[9:0]
-----
INT vВызов прерывания
(v = CR[2:0] – вектор прерывания)
Dec(SPL);
M(SS.SPL) := PSW[5:0].CS;
Dec(SPL); M(SS.SPL) := PCL;
PCL := M(2v);
CS := M(2v+1)[1:0]; FI := 0
-----
Регистровые команды [Код 5] (Для команд ADC и SUBB – [Код F])
ADD pRСложениеAcc := Acc + R*
+++++
ADDC pRСложение с переносомAcc := Acc + R* + C
+++++
SUB pRВычитаниеAcc := Acc - R*
+++++
SUBB pRВычитание с заёмомAcc := Acc - R* - C
+++++
MUL pRУмножениеR7.Acc := Acc X R*
-----
DIV pRДелениеAcc := Acc : R*
----+
AND pRКонъюнкцияAcc := Acc & R*
000++
OR pRДизъюнкцияAcc := Acc V R*
000++
XOR pRНеравнозначностьAcc := Acc XOR R*
000++
CMP pRСравнениеR* – Acc
+++++
RD pRЧтениеAcc := R*
-----
WR pRЗаписьR* := Acc
-----
XCH pRОбменR* <==> Acc
-----
PUSH RПоместить в стекDec(SPL); M(SPL) := R
-----
POP RИзвлечь из стекаR := M(SPL); Inc(SPL)
-----
INC RИнкрементR := R + 1
-++++
DEC RДекрементR := R - 1
-++++
NOT RИнверсияR := NOT R
000++
MOV Rr, RtКопирование Rr := Rt
-----
Команды с ячейками ОЗУ [Код 6 or 7]
Код 6 – прямая адресация (A), 7 – непосредственная (#A)
ADD AСложениеAcc := Acc + DD
+++++
ADDC AСложение с переносомAcc := Acc + DD + FC
+++++
SUB AВычитаниеAcc := Acc - DD
+++++
SUBB AВычитание с заёмомAcc := Acc - DD - FC
+++++
MUL AУмножениеR7.Acc := Acc X DD
-----
DIV AДелениеAcc := Acc : DD
----+
AND AКонъюнкцияAcc := Acc & DD
000++
OR AДизъюнкцияAcc := Acc V DD
000++
XOR AНеравнозначностьAcc := Acc XOR DD
000++
CMP AСравнениеDD – Acc
+++++
RD AЧтениеAcc := DD
-----
WR AЗаписьM(A) := Acc
-----
XCH AОбменM(A) <==> Acc
-----
INC AИнкрементM(A) := M(A) + 1
-++++
DEC AДекрементM(A) := M(A) - 1
-++++
NOT AИнверсияM(A) := NOT DD
000++
Битовые команды 1 [Код 8]
CB A,bСбросить битM(A)[b] := 0
-----
SB A,bУстановить битM(A)[b] := 1
-----
Битовые команды 2 [Код 9]
SBC A,bПропустить следующую команду, если бит сброшен if M(A)[b]=0 then PCL := PCL + 2
-----
SBS A,bПропустить следующую команду, если бит сброшен if M(A)[b]=1 then PCL := PCL + 2
-----
Битовые команды 3 [Код A or B]
CBI a,bСбросить битRIO(a)[b] := 0
-----
SBI a,bУстановить битRIO(a)[b] := 1
-----
NBI a,bИнвертировать битRIO(a)[b] := NOT RIO(a)[b]
-----
SBIC A,bПропустить следующую команду, если бит сброшен if RIO(a)[b]=0 then PCL := PCL + 2
-----
SBIS A,bПропустить следующую команду, если бит установлен if RIO(a)[b]=1 then PCL := PCL + 2
-----
SBISC A,bПропустить следующую команду, если бит установлен
и сбросить бит
if RIO(a)[b]=1 then (PCL := PCL + 2
RIO(a)[b] := 0)
-----
Команды ввода/вывода [Код C]
IN aВводAcc := RIO(a)
-----
OUT aВыводRIO(a) := Acc
-----

Безадресные команды десятичной коррекции

DAA – десятичная коррекция байта в Acc после сложении (кодировка «8421»)

if (BL > 9) or (AC) then B := B + 0x06;  (1)
if (BH > 9) or (C) then B := B + 0x60;  (2)

DSA – десятичная коррекция байта в Acc после вычитании (кодировка «8421»)

if (AC) then B := B - 0x06;          (3)
if (C) then B := B - 0x60;          (4)

Здесь B - предварительный результат операции сложения (вычитания), BH – старшая тетрада B, BL – младшая тетрада B, AC – перенос (заём) из младшей тетрады, C – перенос (заём) из байта.


© Жмакин Анатолий Петрович (Курский государственный университет). anatoly.zhmakin@gmail.com

Оформление Web-страницы - Е.А.Еремин, 2022


Автор сайта - Евгений Александрович Еремин (Пермский государственный педагогический университет). e_eremin@yahoo.com


Free Web Hosting