Коды операций команд (в порядке возрастания)

 

Таблица 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)

 

Следует обратить внимание в приведенном выше примере на использование стековой памяти для временного сохранения текущего значения счетчика, зарезервированного в аккумуляторе, на период работы подпрограммы. Данный приём используется часто для сохранения значения и других регистров общего назначения при их "нехватке" по ходу реализации сложного алгоритма.