Коды операций команд (в порядке возрастания)
Таблица 4 – Коды операций команд
00 NOP | 40 MOV B,B | 80 ADD B | C0 RNZ |
01 LXI B,XXXX | 41 MOV B,C | 81 ADD C | C1 POP B |
02 STAX B | 42 MOV B,D | 82 ADD D | C2 JNZ XXXX |
03 INX B | 43 MOV B,E | 83 ADD E | C3 JMP XXXX |
04 INR B | 44 MOV B,H | 84 ADD H | C4 CNZ XXXX |
05 DCR B | 45 MOV B,L | 85 ADD L | C5 PUSH B |
06 MVI B,XX | 46 MOV B,M | 86 ADD M | C6 ADI XX |
07 RLC | 47 MOV B,A | 87 ADD A | C7 RST 0 |
08 - - - - | 48 MOV C,B | 88 ADC B | C8 RZ |
09 DAD B | 49 MOV C,C | 89 ADC C | C9 RET |
0A LDAX B | 4A MOV C,D | 8A ADC D | CA JZ XXXX |
0B DCX B | 4B MOV C,E | 8B ADC E | CB - - - - |
0C INR C | 4C MOV C,H | 8C ADC H | CC CZ XXXX |
0D DCR C | 4D MOV C,L | 8D ADC L | CD CALL XXXX |
0E MVI C,XX | 4E MOV C,M | 8E ADC M | CE ACI XX |
0F RRC | 4F MOV C,A | 8F ADC A | CF RST 1 |
10 - - - - | 50 MOV D,B | 90 SUB B | D0 RNC |
11 LXI D,XXXX | 51 MOV D,C | 91 SUB C | D1 POP D |
12 STAX D | 52 MOV D,D | 92 SUB D | D2 JNC XXXX |
13 INX D | 53 MOV D,E | 93 SUB E | D3 OUT XXXX |
14 INR D | 54 MOV D,H | 94 SUB H | D4 CNC XXXX |
15 DCR D | 55 MOV D,L | 95 SUB L | D5 PUSH D |
16 MVI D,XX | 56 MOV D,M | 96 SUB M | D6 SUI XX |
17 RAL | 57 MOV D,A | 97 SUB A | D7 RST 2 |
18 - - - - | 58 MOV E,B | 98 SBB B | D8 RC |
19 DAD D | 59 MOV E,C | 99 SBB C | D9 - - - - |
1A LDAX D | 5A MOV E,D | 9A SBB D | DA JC XXXX |
1B DCX D | 5B MOV E,E | 9B SBB E | DB IN XX |
1C INR E | 5C MOV E,H | 9C SBB H | DC CC XXXX |
1D DCR E | 5D MOV E,L | 9D SBB L | DD - - - - |
1E MVI E,XX | 5E MOV E,M | 9E SBB M | DE SBI XX |
1F RAR | 5F MOV E,A | 9F SBB A | DF RST 3 |
20 - - - - | 60 MOV H,B | A0 ANA B | E0 RPO |
21 LXI H,XXXX | 61 MOV H,C | A1 ANA C | E1 POP H |
22 SHLD XXXX | 62 MOV H,D | A2 ANA D | E2 JPO XXXX |
23 INX H | 63 MOV H,E | A3 ANA E | E3 XTHL |
24 INR H | 64 MOV H,H | A4 ANA H | E4 CPO XXXX |
25 DCR H | 65 MOV H,L | A5 ANA L | E5 PUSH H |
26 MVI H,XX | 66 MOV H,M | A6 ANA M | E6 ANI XX |
27 DAA | 67 MOV H,A | A7 ANA A | E7 RST 4 |
28 - - - - | 68 MOV L,B | A8 XRA B | E8 RPE |
29 DAD H | 69 MOV L,C | A9 XRA C | E9 PCHL |
2A LHLD XXXX | 6A MOV L,D | AA XRA D | EA JPE XXXX |
2B DCX H | 6B MOV L,E | AB XRA E | EB XCHG |
2C INR L | 6C MOV L,H | AC XRA H | EC CPE XXXX |
2D DCR L | 6D MOV L,L | AD XRA L | ED - - - - |
2E MVI L,XX | 6E MOV L,M | AE XRA M | EE XRI XX |
2F CMA | 6F MOV L,A | AF XRA A | EF RST 5 |
30 - - - - | 70 MOV M,B | B0 ORA B | F0 RP |
31 LXI SP,ХХХХ | 71 MOV M,C | B1 ORA C | F1 POP PSW |
32 STA XXXX | 72 MOV M,D | B2 ORA D | F2 JP XXXX |
33 INX SP | 73 MOV M,E | B3 ORA E | F3 DI |
34 INR M | 74 MOV M,H | B4 ORA H | F4 CP XXXX |
35 DCR M | 75 MOV M,L | B5 ORA L | F5 PUSH PSW |
36 MVI M,XX | 76 HLT | B6 ORA M | F6 ORI XX |
37 STC | 77 MOV M,A | B7 ORA A | F7 RST 6 |
38 - - - - | 78 MOV A,B | B8 CMP B | F8 RM |
39 DAD SP | 79 MOV A,C | B9 CMP C | F9 SPHL |
3A LHLD XXXX | 7A MOV A,D | BA CMP D | FA JM XXXX |
3B DCX SP | 7B MOV A,E | BB CMP E | FB EI |
3C INR A | 7C MOV A,H | BC CMP H | FC CM XXXX |
3D DCR A | 7D MOV A,L | BD CMP L | FD - - - - |
3E MVI A,XX | 7E MOV A,M | BE CMP M | FE CPI XX |
3F CMC | 7F MOV A,A | BF CMP A | FF RST 7 |
Условные обозначения:
ХХХХ – адрес ячейки памяти или данные
XX – адрес порта или данные
- - - - – код операции не используется
2 Некоторые приемы программирования в кодах
Ниже будут рассмотрены фрагменты программ, реализующие наиболее распространенные, часто встречающиеся приемы обработки данных. Хотя речь идет о программах в машинных кодах, мы будем пользоваться записью команд в мнемоническом изображении, принятом на языке ассемблера для данного типа микропроцессора. Кроме мнемоники кодов операций для упрощения записи вместо конкретных числовых адресов команд мы воспользуемся метками (также принятыми в языке ассемблера).
Перемещение данных
В системе машинных команд (раздел 1) отсутствуют команды перемещения байта непосредственно из одной ячейки памяти в другую. Такую пересылку приходится реализовывать несколькими командами. Усложним эту задачу условием – поменять местами содержимое двух различных ячеек памяти. Для определенности адреса обменивающихся ячеек возьмем равными 5000H и 5001H. (Буква Н здесь и далее обозначает шестнадцатеричную систему счисления, принятую для нумерации ячеек).
…
LXI H, 5000H; | засылка адреса первого числа в пару HL |
LXI B, 5001H; | засылка адреса второго числа в пару BC |
MOV D,M; | копирование первого числа в регистр D |
LDAX B; | копирование второго числа в аккумулятор |
MOV M,A; | перемещение второго числа в ячейку 5000H |
MOV A,D; | перезапись первого числа в аккумулятор |
STAX B; ... | запись содержимого аккумулятора в ячейку 5001H |
Организация цикла
Наиболее рациональный способ организации цикла (многократного повтора одного участка программы) – это создание в одном из регистров процессов счетчика, работающего на вычитание
Перед «телом» цикла счетчик загружается константой числа шагов, а в конце «тела» производится вычитание единицы (декремент) и проверка флага нулевого результата командой условного перехода. Пусть требуется просуммировать массив из 10 целых однобайтных чисел без знака записанных с адреса 5100Н.
MVI B, 0AH ; начальная загрузка счетчика В числом 10
ХRА А ; «очистка» (обнуление) аккумулятора
LXI Н, 5100Н ; засылка в пару НL адреса 1-го числа
М1: АDD М ; A + ячейка [HL] → A
INX H ; продвижение адреса HL + 1 → HL
DCR B ; уменьшение содержимого счетчика
JNZ M1 ; переход к метке М1 по флагу Z=0
HLT ; останов
Использование подпрограмм
Если в какой-либо программе требуется многократно и на разных ее участках выполнить одни и те же действия, целесообразно оформить их в виде подпрограммы. Пусть необходимо просуммировать соответствующие элементы двух массивов из пяти двухбайтных целых чисел без знака. (В младшем байте содержатся младшие разряда числа). Начальные адреса массивов слагаемых 5000Н и 5001Н, а массив сумм располагается с ячейки 5300Н.
Подпрограмма:
SB: PUSH PSW ; сохранение в стеке содержимого аккумулятора и флагов
LDАХ В ; загрузка в А младшего байта 1-го слагаемого (адрес в паре ВС)
АDD М ; сложение А с младшим байтом 2-го слагаемого (адрес в паре
;НL)
SТАХ В ; запись результата в ОЗУ по адресу из пары DЕ
INХ В ; переход по адресам
INХ Н ; к старшим частям слагаемых
INX D ; и результата
STAХ D ; загрузка в А старшего байта второго слагаемого
АDС М ; сложение старших байтов с учетом флага переноса СY
SТАХ D ; запись старшего байта результата
РОР РSW ; восстановление аккумулятора и флагов
RET ; возврат
Основная программа:
LXI SP,8000Н ; создание стека программы
LXI В,5000Н ; адрес массива 1-х слагаемых в пару ВС
LXI H,5100Н ; адрес массива 2-х слагаемых в пару НL
LXI D,5300Н ; адрес массива результатов в пару DE
МVI А,05 ; создание счетчика в А на 5 шагов
М1: САLL SВ ; вызов подпрограммы сложения
INX В ; продвижение адресов
INX H ; на следующую пару слагаемых
INX D ; и ячейку результата
DCR А ; уменьшение счётчика на 1
JNZ M1 ; возврат на М1 до исчерпания счетчика
HLT ; останов (рекомендуется выход в Монитор JMP 40h)
Следует обратить внимание в приведенном выше примере на использование стековой памяти для временного сохранения текущего значения счетчика, зарезервированного в аккумуляторе, на период работы подпрограммы. Данный приём используется часто для сохранения значения и других регистров общего назначения при их "нехватке" по ходу реализации сложного алгоритма.