Программная модель МП КР580ВМ80А
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Программная модель МП КР580ВМ80А
Регистровый файл МП КР580ВМ80А
A
флаги
B
C
D
E
H
L
PC (счётчик команд)
SP (указатель стека )
Пара регистров A + флаги (первая строка таблицы) образуют 16 разрядный
регистр, именуемый PSW, причём A занимает старший байт слова, а флаги –
младший. Аналогично регистры B и C образуют 16-разрядный регистр BC,
регистры D и E – регистр DE, регистры H и L – регистр HL.
Регистр флагов
D7
S
D6
Z
D5
x
D4
AC
D3
x
D2
P
D1
x
D0
C
S – знак числа
Z – нулевой результат
x – значение не определено
AC – вспомогательный перенос
P – чётность
С – перенос
Назначение регистров
A
Аккумулятор. Все арифметические и логические операции производятся только
между A и другими регистрами или между A и байтом непосредственных данных.
B, C, 8-разрядные регистры общего назначения
D, E,
H, L
HL
Регистровая пара, состоящая из двух 8-разрядных регистров (H – старший регистр, L
– младший), используется для косвенно-регистровой адресации 64 Кбайт памяти.
DE
Часто используемая регистровая пара,
содержимым между парами HL и DE .
PC
Счётчик команд, содержит адрес очередной исполняемой команды.
SP
Указатель стека автоматически инкрементируется на 2 при записи пары регистров в
стек (отдельный 8-разрядный регистр в стек записать нельзя, только парами) и
декрементируется при извлечении из регистровой пары из стека.
F
Регистр флагов. Непосредственно недоступен программе, но его в составе PSW
можно сохранить в стеке, а потом извлечь в другую регистровую пару, если нужно
специально установить или проверить нужные флаги.
поскольку имеется
команда обмена
Система команд МП КР580ВМ80А
Так как адресное пространство всего 64 Кбайт, то полный адрес занимает 2 байта.
Команды этого процессора бывают одно-, двух- и трёхбайтными. В первом байте
всегда содержится код операции.
Обозначения:
A, B, ..., L − названия 8-разрядных регистров;
BC, DE, HL − названия регистровых пар, образующих 16-разрядные регистры;
SP − 16-разрядный указатель стека;
PSW − слово состояния программы, содержит регистр флагов;
a16 − двухбайтовый адрес;
M – содержимое ячейки памяти, адресуемое регистровой парой HL;
d8 − байт непосредственных данных;
d16 − два байта непосредственных данных;
pp − номер порта ввода-вывода.
№
Команда
п/п
Код операции
(16-ричный)
Описание
1
ADD A
87
A←(A) + (A)
2
ADD B
80
A←(B) + (A)
3
ADD C
81
A←(C) + (A)
4
ADD D
82
A←(D) + (A)
5
ADD E
83
A←(E) + (A)
6
ADD H
84
A←(H) + (A)
7
ADD L
85
A←(L) + (A)
8
ADD M
86
A←Loc(HL) + (A)
9
ADI d8
C6
A←d8 + (A)
10
ADC A
8F
A←(A) + (A) + CY
11
ADC B
88
A←(B) + (A) + CY
12
ADC C
89
A←(C) + (A) + CY
13
ADC D
8A
A←(D) + (A) + CY
14
ADC E
8B
A←(E) + (A) + CY
15
ADC H
8C
A←(H) + (A) + CY
16
ADC L
8D
A←(L) + (A) + CY
17
ADC M
8E
A←Loc(HL) + (A) + CY
18
ACI d8
CE
A←d8 + (A) + CF
19
ANA A
A7
Проверка A
20
ANA B
A0
Логическое И B с A
21
ANA C
A1
Логическое И C с A
22
ANA D
A2
Логическое И D с A
23
ANA E
A3
Логическое И E с A
24
ANA H
A4
Логическое И H с A
25
ANA L
A5
Логическое И L с A
26
ANA M
A6
Логическое И Loc(HL) с A
27
ANI d8
E6
Логическое И непосредственные данные с A
28
CALL a16
CD
Передать управление подпрограмме по адресу a16
29
CZ a16
CC
Вызвать подпрограмму по адресу a16, если нуль
30
СNZ a16
C4
То же, если не нуль
31
СP a16
F4
То же, если плюс
32
СM a16
FC
То же, если минус
33
CC a16
DC
То же, если перенос
34
CNC a16
D4
То же, если нет переноса
35
CPE a16
EC
То же, если чётно
36
CPO a16
E4
То же, если нечётно
37
CMA
2F
Инвертировать A
38
CMC
3F
Инвертировать перенос
39
CMP A
BF
Установить флаг FZ
40
CMP B
B8
Сравнить A с B
41
CMP C
B9
Сравнить A с C
42
CMP D
BA
Сравнить A с D
43
CMP E
BB
Сравнить A с E
44
CMP H
BC
Сравнить A с H
45
CMP L
BD
Сравнить A с L
46
CMP M
BE
Сравнить A с Loc(HL)
CPI d8
FE
Сравнить A с непосредственными данными, заданными
в команде
48
DAA
27
Десятичная коррекция аккумулятора
49
DAD B
09
Сложить BC с HL
50
DAD D
19
Сложить DE с HL
51
DAD H
29
Сложить HL с HL (удвоение HL)
47
52
DAD SP
39
Сложить SP с HL
53
DCR A
3D
A←(A) - 1 (декремент A)
54
DCR B
05
B←(B) – 1
55
DCR C
0D
C←(C) – 1
56
DCR D
15
D←(D) – 1
57
DCR E
1D
E←(E) – 1
58
DCR H
25
H←(H) – 1
59
DCR L
2D
L←(L) – 1
60
DCR M
35
Loc (HL)←(Loc(HL)) -1
61
DCX B
0B
BC←(BC) – 1
62
DCX D
1B
DE←(DE) -1
63
DCX H
2B
HL←(HL) – 1
64
DCX SP
3B
SP←(SP) -1
65
DI
F3
Запретить прерывания
66
EI
FB
Разрешить прерывания
67
HLT
76
Останов процессора
68
IN pp
DB
Ввести данные из порта pp
69
INR A
3C
A←(A) + 1 (инкрементировать A)
70
INR B
04
Инкрементировать B
71
INR C
0C
Инкрементировать C
72
INR D
14
Инкрементировать D
73
INR E
1C
Инкрементировать E
74
INR H
24
Инкрементировать H
75
INR L
2C
Инкрементировать L
76
INR M
34
Инкрементировать содержимое Loc(HL)
77
INX B
03
Инкрементировать BС
78
INX D
13
Инкрементировать DE
79
INX H
23
Инкрементировать HL
80
INX SP
33
Инкрементировать SP
81
JMP a16
C3
Перейти по адресу a16
82
JZ a16
CA
То же, если нуль
83
JNZ a16
C2
То же, если не нуль
84
JP a16
F2
То же, если плюс
85
JM a16
FA
То же, если минус
86
JC a16
DA
То же, если перенос
87
JNC a16
D2
То же, если нет переноса
88
JPE a16
EA
Перейти по адресу a16, если паритет чётный
89
JPO a16
E2
Перейти по адресу a16, если паритет нечётный
90
LDA a16
3A
Загрузить A из ячейки с адресом a16
91
LDAX B
0A
Загрузить A из ячейки с адресом Loc(BC)
92
LDAX D
1A
Загрузить A из ячейки с адресом Loc(DE)
93
LHLD a16
2A
Загрузить в HL содержимое ячейки с адресом a16
94
LXI B,d16
01
Загрузить в BC непосредственные данные d16
95
LXI H,d16
21
Загрузить в HL непосредственные данные d16
96
LXI SP,d16
31
Загрузить в SP непосредственные данные d16
97
MOV A,A
7F
Переслать из A в A
98
MOV A,B
78
Переслать из B в A (B←(A) )
99
MOV A,C
79
Переслать из C в A
100 MOV A,D
7A
Переслать из D в A
101 MOV A,E
7B
Переслать из E в A
102 MOV A,H
7C
Переслать из H в A
103 MOV A,L
7D
Переслать из L в A
104 MOV A,M
7E
Переслать из Loc(HL) в A
105 MOV B,A
47
Переслать из A в B
106 MOV B,B
40
Переслать из B в B
107 MOV B,C
41
Переслать из C в B
108 MOV B,D
42
Переслать из D в B
109 MOV B,E
43
Переслать из E в B
110 MOV B,H
44
Переслать из H в B
111 MOV B,L
45
Переслать из L в B
112 MOV B,M
46
Переслать из Loc(HL) в B
113 MOV C,A
4F
Переслать из A в C
114 MOV C,B
48
Переслать из B в C
115 MOV C,C
49
Переслать из C в C
116 MOV C,D
4A
Переслать из D в C
117 MOV C,E
4B
Переслать из E в C
118 MOV C,H
4C
Переслать из H в C
119 MOV C,L
4D
Переслать из L в C
120 MOV C,M
4E
Переслать из Loc(HL) в C
121 MOV D,A
57
Переслать из A в D
122 MOV D,B
50
Переслать из B в D
123 MOV D,C
51
Переслать из C в D
124 MOV D,D
52
Переслать из D в D
125 MOV D,E
53
Переслать из E в D
126 MOV D,H
54
Переслать из H в D
127 MOV D,L
55
Переслать из L в D
128 MOV D,M
56
Переслать из Loc(HL) в D
129 MOV E,A
5F
Переслать из A в E
130 MOV E,B
58
Переслать из B в E
131 MOV E,C
59
Переслать из C в E
132 MOV E,D
5A
Переслать из D в E
133 MOV E,E
5B
Переслать из E в E
134 MOV E,H
5C
Переслать из H в E
135 MOV E,L
5D
Переслать из L в E
136 MOV E,M
5E
Переслать из Loc(HL) в E
137 MOV H,A
67
Переслать из A в H
138 MOV H,B
60
Переслать из B в H
139 MOV H,C
61
Переслать из C в H
140 MOV H,D
62
Переслать из D в H
141 MOV H,E
63
Переслать из E в H
142 MOV H,H
64
Переслать из H в H
143 MOV H,L
65
Переслать из L в H
144 MOV H,M
66
Переслать из Loc(HL) в H
145 MOV L,A
6F
Переслать из A в L
146 MOV L,B
68
Переслать из B в L
147 MOV L,C
69
Переслать из C в L
148 MOV L,D
6A
Переслать из D в L
149 MOV L,E
6B
Переслать из E в L
150 MOV L,H
6C
Переслать из H в L
151 MOV L,L
6D
Переслать из L в L
152 MOV L,M
6E
Переслать из Loc(HL) в L
153 MOV M,A
77
Переслать из A в M
154 MOV M,B
70
Переслать из B в M
155 MOV M,C
71
Переслать из C в M
156 MOV M,D
72
Переслать из D в M
157 MOV M,E
73
Переслать из E в M
158 MOV M,H
74
Переслать из H в M
159 MOV M,L
75
Переслать из L в M
160 MVI A,d8
3E
Переслать d8 в A
161 MVI B,d8
06
Переслать d8 в B
162 MVI C,d8
0E
Переслать d8 в C
163 MVI D,d8
16
Переслать d8 в D
164 MVI E,d8
1E
Переслать d8 в E
165 MVI H,d8
26
Переслать d8 в H
166 MVI L,d8
2E
Переслать d8 в L
167 MVI M,d8
36
Переслать d8 в Loc(HL)
168 NOP
00
Нет операции
169 ORA A
B7
Проверить A и сбросить перенос
170 ORA B
B0
Логичеcкая операция A ИЛИ B
171 ORA C
B1
Логичеcкая операция A ИЛИ C
172 ORA D
B2
Логичеcкая операция A ИЛИ D
173 ORA E
B3
Логичеcкая операция A ИЛИ E
174 ORA H
B4
Логичеcкая операция A ИЛИ H
175 ORA L
B5
Логичеcкая операция A ИЛИ L
176 ORA M
B6
Логичеcкая операция A ИЛИ M
177 ORI d8
F6
Логичеcкая операция A ИЛИ d8
178 OUT pp
D3
Записать A в порт pp
179 PCHL
E9
Передать управление по адресу в HL
180 POP B
C1
Извлечь слово из стека в BC
181 POP D
D1
Извлечь слово из стека в DE
182 POP H
E1
Извлечь слово из стека в HL
183 POP PSW
F1
Извлечь слово из стека в PSW
184 PUSH B
C5
Поместить в стек содержимое BC
185 PUSH D
D5
Поместить в стек содержимое DE
186 PUSH H
E5
Поместить в стек содержимое HL
187 PUSH PSW F5
Поместить в стек содержимое PSW
188 RAL
17
Циклический сдвиг CY + A влево
189 RAR
1F
Циклический сдвиг CY + A вправо
190 RLC
07
Сдвинуть A влево на один разряд с переносом
191 RRC
0F
Сдвинуть A вправо на один разряд с переносом
192 RET
C9
Возврат из подпрограммы
193 RZ
C8
Возврат из подпрограммы, если FZ=0
194 RNZ
C0
Возврат из подпрограммы, если FZ=1
195 RP
F0
Возврат из подпрограммы, если FP=1
196 RM
F8
Возврат из подпрограммы, если FP=0
197 RC
D8
Возврат из подпрограммы, если FC=1
198 RNC
D0
Возврат из подпрограммы, если FC=0
199 RPE
E8
Возврат из подпрограммы, если паритет чётный
200 RPO
E0
Возврат из подпрограммы, если паритет нечётный
201 RST 0
C7
Запуск программы с адреса 0
202 RST 1
CF
Запуск программы с адреса 8h
203 RST 2
D7
Запуск программы с адреса 10h
204 RST 3
DF
Запуск программы с адреса 18h
205 RST 4
E7
Запуск программы с адреса 20h
206 RST 5
EF
Запуск программы с адреса 28h
207 RST 6
F7
Запуск программы с адреса 30h
208 RST 7
FF
Запуск программы с адреса 38h
209 SPHL
F9
Загрузить SP из HL
210 SHLD a16
22
Записать HL по адресу a16
211 STA a16
32
Записать A по адресу a16
212 STAX B
02
Записать A по адресу Loc(BC)
213 STAX D
12
Записать A по адресу Loc(DE)
214 STC
37
Установить флаг переноса (CF=1)
215 SUB A
97
Вычесть А из А (очистить А)
216 SUB B
90
Вычесть B из А
217 SUB C
91
Вычесть C из А
218 SUB D
92
Вычесть D из А
219 SUB E
93
Вычесть E из А
220 SUB H
94
Вычесть H из А
221 SUB L
95
Вычесть L из А
222 SUB M
96
Вычесть M из А
223 SUI d8
D6
Вычесть d8 из А
224 SBB A
9F
Вычесть А из А (очистить А)
225 SBB B
98
Вычесть c заёмом B из А
226 SBB C
99
Вычесть c заёмом C из А
227 SBB D
9A
Вычесть c заёмом D из А
228 SBB E
9B
Вычесть c заёмом E из А
229 SBB H
9C
Вычесть c заёмом H из А
230 SBB L
9D
Вычесть c заёмом L из А
231 SBB M
9E
Вычесть c заёмом M из А
232 SBI d8
DE
Вычесть c заемом d8 из А
233 XCHG
EB
Обмен содержимым DE и HL
234 XTHL
E3
Обмен содержимого вершины стека с содержимым HL
235 XRA A
AF
Исключающее ИЛИ A с A (очистка A)
236 XRA B
A8
Исключающее ИЛИ B с A
237 XRA C
A9
Исключающее ИЛИ C с A
238 XRA D
AA
Исключающее ИЛИ D с A
239 XRA E
AB
Исключающее ИЛИ E с A
240 XRA H
AC
Исключающее ИЛИ H с A
241 XRA L
AD
Исключающее ИЛИ L с A
242 XRA M
AE
Исключающее ИЛИ Loc(HL) с A
243 XRI d8
EE
Исключающее ИЛИ d8 с A
Особенности выполнения некоторых команд
Команды пересылки данных между регистрами (типичный случай регистровой
адресации) кодируются в одном байте следующим образом:
01DDDSSS
где 01 − код операции пересылки, DDD − номер регистра назначения; SSS −
номер регистра приёмника. Никаких флагов команды пересылки не
устанавливают. На выполнение команды тратится один машинный цикл.
Кодировка номера регистра (DDD и SSS)
Код Регистр
000 B
001 C
010 D
011 E
100 H
101 L
110 M
111 A
M – содержимое ячейки памяти, адресуемое регистровой парой HL .
Пересылка из ячейки памяти в регистр и из регистра в ячейку памяти
осуществляется с помощью косвенно-регистровой адресации. Это означает, что
адрес ячейки памяти загружается в регистровую пару HL, а в командах типа MOV
A,M (такие команды кодируются как 01DDD110) в регистр A будет загружено
содержимое ячейки памяти, адрес которой содержится в HL. Так как в таких
командах требуется обращение к памяти, то на их выполнение нужно два
машинных цикла. Система команд процессора экономична и не рассчитана на
поддержку языков высокого уровня. Такая поддержка появится в более поздних
моделях процессоров Intel.
Следует отметить, что средняя длина команды в типичной программе равна двум
байтам, а для программ более поздних 16-разрядных процессоров типа 8086 она
равна 4,1. Поэтому на логических программах 8-разрядные процессоры не сильно
уступали 16-разрядным.
Аналогично работают и команды записи в память.
Команды непосредственной пересылки являются двухбайтными. В первом байте
кодируются код операции и регистр, а второй содержит байт пересылаемых
данных:
00DDD110 XXXXXXXX
Очевидно, что для исполнения команды требуется два цикла.
Более интересна версия этой команды MVI M,d8, когда байт непосредственных
данных пишется в память. Она кодируется так:
00110110 ХХХХХХХХ
Исполнение занимает три цикла.
Очень полезна группа команд LXI, предназначенных для непосредственной
загрузки регистровых пар непосредственным значением. Она позволяет одной
командой переместить сразу два байта данных и широко используется как в
операциях адресной арифметики, так и при выполнении целочисленных
вычислений.
Команда кодируется следующим образом:
00RP0001 xxxxxxxx zzzzzzzz
где RP − регистровая пара; хххххххх − младший байт данных, zzzzzzzzz − старший
байт данных.
При исполнении команды, требующей трех машинных циклов, старший байт
данных грузится в старший регистр регистровой пары, а младший байт − в
младший регистр. Название старшего регистра стоит в названии пары первым.
Команда прямой загрузки аккумулятора LDA a16 позволяет загрузить в него
данные, на которые указывает адрес, содержащийся в самой команде.
Длина команды три байта. Кодируется команда следующим образом:
00111010 хххххххх zzzzzzzz
где xxxxxxxx − младшая часть адреса; zzzzzzzz − старшая часть адреса.
Исполнение занимает машинных четыре цикла.
Симметричная по действию команда STA.
Команда LHLD addr (мнемоника расшифровывается Load H and L Direct)
загружает в регистр L содержимое ячейки памяти по адресу, кодируемому во
втором и третьем байтах команды (т.е. адресация прямая). В регистр
H загружается байт из ячейки addr+1.
Команда выполняется за пять машинных циклов. Обратная ей по действию
команда SHLD (Store H and L Direct).
Команда LDAX reg (мнемоника от Load accumulator indirect). Содержимое ячейки
памяти, адресуемой регистровой парой BC или DE, за два цикла загружается в
аккумулятор.
Обратная по действию команда STAX reg.
Очень полезная команда XCHG. (H)↔(D), (L) ↔(E). Выполняется за один цикл.
Арифметические команды
Начнем с команды сложения. Сложить содержимое аккумулятора с содержимым
регистра ADD reg
Кодировка команды: 10000RRR
Выполняется за один цикл. Следует отметить, что все арифметические команды
изменяют флаги: Z, S, P, CY, AC.
При выполнении многобайтового сложения необходимо учитывать перенос.
Поэтому младшие байты слагаемых складываются с помощью команды ADD, а
все последующие посредством команды ADC reg. Она учитывает при сложении
содержимое флага переноса. Аналогично устроены команды вычитания.
Разновидностью команды сложения является команда инкремента регистра,
необходимая для адресной арифметики и организации циклов.
INR reg
Кодировка команды: 00ККК100
Устанавливаются все флаги, за исключением CY.
Команда DCR reg обратная по действию команде INR reg.
Довольно редко используется команда DAA (мнемоника от Decimal Adjust
Accumulator) выполняет следующие действия: если содержимое младшего
полубайта (нибла) аккумулятора меньше 9 или установлен флаг CY, то (A) + 6,
если значение старшего полубайта больше 9 или установлен флаг CY, то 6
добавляется к содержимому старшего полубайта.
При этом устанавливаются все флаги.
Логические команды
ANA reg
Флаг CY сбрасывается, а AC устанавливается (в 8085). В микропроцессоре 8080 на
эти флаги влияет результат операции над третьими битами операндов.
В командах групп XRA и ORA флаги CY и AC сбрасываются.
CMP reg − сравнить регистр (Compare register), вычитает содержимое регистра из
аккумулятора. Содержимое аккумулятора не изменяется. Флаги устанавливаются
как при вычитании. Z=1, если (A) = (reg). CR = 1, если (A) < (reg).
Циклический сдвиг влево RCL работает следующим образом. Содержимое
аккумулятора сдвигается на одну позицию влево, т. е. каждый старший бит
получает значение стоящего рядом с ним младшего бита. Содержимое седьмого
бита переходит в нулевой бит аккумулятора:
(CY) ←(b7).
RRC − сдвигает содержимое аккумулятора вправо. (CY)← (b0), (b7)←(b0).
RAL − (Rotate Left trough Carry). Сначала (CY) заносится в младший бит
аккумулятора, а потом в CY записывается содержимое старшего его бита.
Формально: (b0)←(CY), (CY)←(b7).
Аналогично со сдвигом вправо: (Bn)←(Bn+1), (CY)←(b0), (b7)←(CY).
Команда CMA (мнемоника от Complement Accumulator) инвертирует каждый бит
аккумулятора, т.е. 0 становится 1 и наоборот. Флаги не устанавливаются.
Команда CMC инвертирует содержимое флага переноса. Другие флаги не
устанавливаются.
По командам управления стоит отметить выполнение команды вызова
подпрограммы.
CALL addr − при ее выполнении в стек записывается адрес следующей
за CALL команды, значение указателя стека дважды декрементируется, а
управление передается по указанному адресу.
Команда возврата из подпрограммы записывает в счетчик команд адрес из
вершины стека, увеличивает указатель стека на 2 и передает управление на новый
адрес. Поэтому если модифицировать адрес возврата в стеке, то можно перейти
совсем в другое место.
Для этого есть, впрочем, более удобная возможность − команда PCHL. Она
позволяет передать управление по адресу в регистровой паре HL.
Иногда в системных программах используется команда останова HLT. Процессор
останавливается, регистры и флаги не устанавливаются. Для запуска важно подать
сигнал Reset.
IN port - данные из порта с указанным номером считываются в аккумулятор.
Циклов 3. Флаги не изменяются.
OUT port - содержимое аккумулятора помещается на шину данных для записи в
указанный в команде порт.