Коды операций команд (в порядке возрастания)
Таблица 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)
Следует обратить внимание в приведенном выше примере на использование стековой памяти для временного сохранения текущего значения счетчика, зарезервированного в аккумуляторе, на период работы подпрограммы. Данный приём используется часто для сохранения значения и других регистров общего назначения при их "нехватке" по ходу реализации сложного алгоритма.