Под командой микропроцессора понимается двоичное слово, заставляющее МП выполнять определённые действия. Длина команды обычно равна 1 байту. Однако для данного типа МП могут использоваться двух- и трёхбайтовые команды, записываемые в регистр команд в течении цикла выбора. В течении следующего за ним цикла выполнения МП дешифрирует команды и генерирует сигналы управления процессором, выполнения предусмотренных данной командой операций. Любая команда должна нести в себе информацию двух видов: указывать заглавными МП, что делать; указывать местоположение обрабатываемых данных. Поэтому команда состоит из двух частей: кода операции (КОП) и адреса. Число команд МП значительно больше, чем число различных кодов операций, так как при формировании команды один и тот же КОП может использоваться при различных способах адресации. Для сокращённой записи названия команды используется её мнемоническое обозначение. В качестве его обычно используются три буквы названия операции, выполняемой команды. Если команда оперирует с числовыми данными или адресами областей памяти, то мнемоническое обозначение команды дополняется цифрами или буквами, указывающими на важные им адреса помещения операндов, мнемоническая запись команд является не только удобной формой представления КОП, но и составной частью команды при использовании языка Ассемблер. Мнемоническое обозначение команд МП КП 580 БМ 80 и соответствующее каждой команде двоичные и шестнадцатеричные коды операций представлены в табл. 1.2, 1.3.
Мнемоника | Код команды | Содержание команды | Флажки: CY Z S P AC |
I. ПЕРЕМЕЩЕНИЕ: | |||
1. Пересылка: | |||
MOV R,r | 01RRRrrr | R <= r | - - - - - |
MOV R,M | 01RRR110 | R <= M(HL) | - - - - - |
MOV M,r | 01110rrr | M(HL) <= r | - - - - - |
MVI R,d | 00RRR110 | R <= d | - - - - - |
MVI M,d | M(HL) <= d | - - - - - | |
SPHL | F9 | SP <= HL | - - - - - |
2. Загрузка: | |||
LXI RP,dd | 00RP0001 | RP <= dd | - - - - - |
LDAX B | 0A | A <= M(BC) | - - - - - |
LDAX D | 1A | A <= M(DE) | - - - - - |
LDA aa | 3A | L <= M(aa) | |
LHLD aa | 2A | H <= M(aa+1) | - - - - - |
3. Запись: | |||
STAX B | M(BC) <= A | - - - - - | |
STAX D | M(DE) <= A | - - - - - | |
STA aa | M(aa) <= A | - - - - - | |
SHLD aa | M(aa) <= L | - - - - - | |
M(aa+1) <= H | |||
4. Обмен: | |||
XCHG | EB | DE <=> HL | - - - - - |
XTHL | E3 | HL <=> SP | - - - - - |
5. Операция со стеком: | |||
PUSH B | C5 | M(-SP) <= BC | - - - - - |
PUSH D | D5 | M(-SP) <= DE | - - - - - |
PUSH H | E5 | M(-SP) <= HL | - - - - - |
PUSH PSW | F5 | M(-SP) <= AF | - - - - - |
POP B | C1 | BC <= M(SP+) | - - - - - |
POP D | D1 | DE <= M(SP+) | - - - - - |
POP H | E1 | HL <= M(SP+) | - - - - - |
POP PSW | F1 | AF <= M(SP+) | - - - - - |
II. ЛОГИЧЕСКИЕ ОПЕРАЦИИ | |||
1. Коньюнкция: | |||
ANA R | 10100rrr | A <= A and r | 0 + + + 0 |
ANA M | A <=A and M(HL) | 0 + + + 0 | |
ANI d | E6 | A <= A and d | 0 + + + 0 |
2. Исключающее ИЛИ: | |||
XRA R | 10101rrr | A <= A xor r | 0 + + + 0 |
XRA M | A <=A xor M(HL) | 0 + + + 0 | |
XRI d | EE | A <= A xor d | 0 + + + 0 |
3. Дизьюнкция: | |||
ORA R | 10110rrr | A <= A or r | 0 + + + 0 |
ORA M | A <= A or M(HL) | 0 + + + 0 | |
ORI d | F6 | A <= A or d | 0 + + + 0 |
4. Сдвиги: | |||
RLC | A7 <= A6 <= … | + - - - - | |
… <= A0 <= A7. | |||
CY <= A7 | |||
RRC | 0F | A0 <= A1 <= … | + - - - - |
… <= A7 <= A0. | |||
CY <= A0 | |||
RAL | A7 <= A6 <= … | + - - - - | |
… <= A0 <= CY | |||
<= A7 | |||
RAR | 0F | A0 <= A1 <= … | + - - - - |
… <= A7 <= CY | |||
<= A7 | |||
5. Инверсия: | |||
CMA | 2E | A <= not A | - - - - - |
CMC | 3F | CY <= not CY | + - - - - |
6. Установка: | |||
STC | CY <= 1 | 1 - - - - | |
III. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ: | |||
1. Сложение: | |||
ADD R | 10000rrr | A <= A + r | + + + + + |
ADD M | A <= A + M(HL) | + + + + + | |
ADI d | C6 | A <= A + d | + + + + + |
ADC R | 10001rrr | A <= A + r + CY | + + + + + |
ADC M | A <= A + M(HL) + CY | + + + + + | |
ADC d | CE | A <= A + d + CY | + + + + + |
DAD RP | 00RP1001 | HL <= HL + BC | + - - - - |
2. Вычитание: | |||
SUB R | 10010rrr | A <= A - r | + + + + + |
SUB M | A <= A - M(HL) | + + + + + | |
SUI d | D6 | A <= A - d | + + + + + |
SBB R | 10011rrr | A <= A - r - CY | + + + + + |
SBB M | A <= A - M(HL) - CY | + + + + + | |
SBI d | DE | A <= A - d - CY | + + + + + |
3. Увеличение: | |||
INR R | 00RRR100 | R <= R + 1 | - + + + + |
INR M | M(HL) <= M(HL) + 1 | - + + + + | |
INX RP | 00RP0011 | RP <= RP + 1 | - - - - - |
4. Уменьшение | |||
DCR R | 00RRR101 | R <= R - 1 | - + + + + |
DCR M | M(HL) <= M(HL) - 1 | - + + + + | |
DCX RP | 00RP1011 | RP <= RP - 1 | - - - - - |
5. Сравнение: | |||
CMP R | 10111rrr | A - R | + + + + + |
CMP M | A - M(HL) | + + + + + | |
CPI d | FE | A - d | + + + + + |
6. Коррекция: | |||
DAA | A <= A(2/10) | + + + + + | |
IV. ПЕРЕДАЧА УПРАВЛЕНИЯ: | |||
1. Безусловный переход: | |||
JMP aa | 11000011 (C3) | PC <= aa | - - - - - |
PCHL | E9 | PC <= HL | - - - - - |
2. Переход по условию: | |||
JKK aa | 11KKK010 | PC <= aa, если KK истинно | - - - - - |
3. Обращение к подпрограмме: | |||
CALL aa | 11001101 (CD) | M(-SP) <= PC <= aa | - - - - - |
RST n | 11nnn111 | M(-SP) <= PC <= 8n | - - - - - |
4. Обращение к подпрограмме по условию: | |||
CKK aa | 11KKK100 | M(-SP) <= PC <= aa, если KK истинно | - - - - - |
5. Возврат из подпрограммы: | |||
RET | 11001001 (C9) | PC <= M(SP+) | - - - - - |
6. Возврат из подпрограммы по условию: | |||
RKK aa | 11KKK000 | PC <= M(SP+), если KK истинно | - - - - - |
V. УПРАВЛЕНИЕ: | |||
IN p | DB | A <= (p) | - - - - - |
OUT p | D3 | (p) <= A | - - - - - |
EI | FB | разрешение прерываний | - - - - - |
DI | F3 | запрет прерываний | - - - - - |
HLT | остановка | - - - - - | |
NOP | нет операций | - - - - - |
Примечание.
1. Поле операндов: d – байт данных (08H, 1AH и т.д.);
dd – 2 байта данных (2435H, 0AD4H и т.д.);
аа – двухбайтовый адрес;
p – байт номера порта BB;
n – целое число в диапазоне от 0 до 7;
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2. Поле комментариев: R – один из регистров A, B, C, D, E, H, L, или его содержимое, если регистр является приёмником результата;
r – то же, если регистр – источник данных;
RP – одна из регистровых пар B, D, HL, SP, или её содержимое;
М – косвенный регистр;
M(RP) – ячейка памяти с адресом, хранящимся в регистровой паре RP;
M(aa) – ячейка памяти с адресом aa.
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
3. Циклы: N – число циклов выполнения команды;
[N] – то же, но при доступе в память (когда R = M);
(N) – число циклов, если условие не выполнено.
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
4. Коды регистров: и регистровых пар:
R: RRR или rrr RP: RP
B 000
C 001 B 00
D 010
E 011 D 01
H 100
L 101 H 10
M 110
A 111 SP и PSW 11
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
5. Коды условий: KK: KKK
NZ 000 - Z=0 (не нуль)
Z 001 - Z=1 (нуль)
NC 010 - CY=0 (нет переноса)
C 011 - CY=1 (есть перенос)
P0 100 - P=0 (нечётность)
PE 101 - P=1 (чётность)
P 110 - S=0 (плюс)
M 111 - S=1 (минус)
Пример 1. Сложить регистр B (содержимое 02H) с регистром С (содержимое 30H), результат записать в ячейку памяти по адресу 1090H, после чего осуществить переход на адрес 10AAH, где произвести остановку процессора.
Адрес | OBJ | Метка | КОП | Операнды | Комментарий: |
1000H | MOV | A, B | : A <= B | ||
1001H | ADD | C | : A <= A + C | ||
1002H | STA | 1090H | : M(1090) <= A | ||
1003H | |||||
1004H | |||||
1005H | C3 | JMP | 10AAH | : PC <= 10AAH | |
1006H | AA | ||||
1007H |
Вход программы в УМК:
Действия: | Клавиатура | Дисплей |
1. Включить УМК и осуществить сброс | вкл. | 8, 8, 8, 8, 8, 8,- |
< СБ > | ||
2. Ввод директивы П просмотра и изменения содержимого ячеек памяти ОЗУ | < П > | |
3. Набор адреса 100H | 10,00 | |
4. Ввод набранного адреса | < > | 1000 хх |
5. Набор данных 78 | 1000 78 | |
6. Ввод набранных данных | < > | - |
10. Набор следующих данных 81 | 1000 81 | |
11. Ввод набранных данных | ВП | |
и т.д. |
Теперь следует опять с помощью директивы аналогичным образом проверить содержимое ячеек памяти с адреса 1000H по адрес 1007H, и если при вводе объектного кода программы была допущена ошибка, то исправить её.
Ввод кода команды остановки процессора по адресу перехода 10AAH:
Действия: | Клавиатура | Дисплей |
1. Ввод директивы П просмотра и изменения содержимого ячеек памяти ОЗУ | П | |
3. Набор адреса 10ААH | 1, 0, А, А | 10АА |
4. Ввод набранного адреса | < > | 10АА хх |
5. Набор данных 76H | 7, 6 | 10АА 76 |
6. Ввод набранных данных | ВП | - |
Загрузка HEX числа в регистры B – 02H и C – 30H
Действия: | Клавиатура | Дисплей |
1. Ввод директивы РГ просмотра и изменения содержимого ячеек регистров МП | РГ | - |
2. Ввод регистра В | В | b - xx |
3. Набор HEX числа 02H | 0, 2 | b - 02 |
4. Ввод набранного числа в регистр B | ВП | - |
5. Ввод директивы РГ | РГ | |
6. Ввод регистра C | С | c - xx |
7. Набор HEX числа 30H | 3, 0 | c - 30 |
8. Ввод набранного числа в регистр C | ВП | - |
Запуск программы на выполнение:
Действия: | Клавиатура | Дисплей |
1. Ввод директивы СТ старта программы | СТ | |
2. Набор адреса старта 1000H | 1, 0, 0, 0 | |
3. Запуск программы | ВП |
Программа выполняется мгновенно, поэтому можно сразу же приступить к просмотру содержимого ячейки памяти с адресом 1090H.
Просмотр содержимого ячейки памяти с адресом 1090H:
Действия: | Клавиатура | Дисплей |
1. Сброс | СБ | - |
2. Ввод директивы П | П | |
3. Набор адреса 1090H | 1, 0, 9, 0 | |
4. Ввод набранного адреса | ВП | 1090 12 |
HEX число 32H и есть сумма чисел 02H и 30H.
Далее осуществим выполнение программы на уровне машинных циклов:
Действия: | Клавиатура | Дисплей |
1. Сброс | СБ | - |
2. Переключение УМК в режим пошагового выполнения программы, при этом произойдёт подключение индикации. | РБ/ШГ в нижнее положение | - |
3. Переключение УМК в поцикловый режим работы. | КМ/ЦК в нижнее положение | - |
4. Вышеописанным образом с помощью директивы П восстанавливаются исходные значения регистров: B - 02H и C - 30H. | ||
5. Ввод директивы СТ старта программы. | СТ | - |
6. Набор адреса старта 1000H. | 1, 0, 0, 0 | |
7. Запуск программы. | ВП |
Выполнение программы будет осуществляться по циклам и должно сопровождаться нажатием клавиши ШГ после каждого цикла.
Пример 2. Загрузить в регистровую пару DE число 0F35H и записать его в ячейку памяти по адресу 1008H. После чего остановить процессор.
Адрес | OBJ | Метка | КОП | Операнды | Комментарий: |
1000H | LXI | D, 0F35H | : DE <= 0F35H | ||
1001H | |||||
1002H | 0F | ||||
1003H | EB | XCHG | : HL <=> DE | ||
1004H | SHLD | 0908H | : M (1008H) <= L | ||
1005H | : M (1009H) <= H | ||||
1006H | |||||
1007H | HLT | : остановить процессор |
Вышеописанным образом произвести ввод объектного кода в ячейки памяти УМК, после чего проверить содержимое ячеек памяти с адреса 1000Н по адрес 1007Н.
Директивой СТ 1000 осуществить запуск программы на исполнение. После остановки процессора (потухший дисплей) произвести сброс клавишей СБ и проверить при помощи директивы П содержимое ячеек памяти по адресам 1008Н и 1009Н, там должны находиться числа 35Н и 0FН соответственно.
Далее осуществляется выполнение программы на уровне машинных циклов. Для этого УМК переключается в шаговый режим (клавишей РБ/ШГ в нижнее положение) выполнения программы и в поцикловый режим работы (клавиша КМ/ЦК в нижнее положение).
Директивой СТ 1000 осуществляется запуск программы на исполнение и выполнение машинного цикла осуществляется нажатием клавиши ШГ.
Пример 3. Записать в стек содержимое регистровой пары DE (5687H), считать его в регистровую пару BC и осуществить вызов подпрограммы остановки процессора по адресу 1032H.
Программа имеет вид:
Адрес | OBJ | Метка | КОП | Операнды | Комментарий: |
1000H | D5 | PUSH | D | : -(SP) <= DE | |
1001H | C1 | POP | B | : BC <= (SP)+ | |
1002H | CD | CALL | 1032H | : -(SP) <= PC <= 1032H | |
1003H | |||||
1004H |
Вышеописанным образом произвести ввод объектного кода ячейки памяти УМК, после чего проверить содержимое ячеек памяти с адреса 1000H по адрес 1004Н. В ячейку памяти по адресу 1032Н директивой П 1032 занести код остановки процессора 76Н. В регистровую пару DE директивой РГ П поместить число 5687Н.
Далее УМК переключаться в шаговый режим (клавиша РБ/ШГ в нижнее положение) выполнения программы и в поцикловый режим работы (клавиша КМ/ЦК в нижнее положение).
Директивой СТ 1000 осуществляется запуск программы на исполнение и выполнение каждого машинного цикла осуществляется нажатием клавиши ШГ.
Варианты заданий.
Написать программу, ввести объектный код в УМК и осуществить выполнение по циклам.
Задание 1. Сложить два числа СЕН и 21Н, хранящиеся в ячейках памяти по адресам 1020Н и 1021Н соответственно, записать полученную сумму в ячейку памяти по адресу 1022Н и остановить процессор.
Задание 2. Из числа EFH, хранящегося в ячейке памяти по адресу 0A00H, вычесть 45Н, записать разность в ячейку памяти по адресу 09FFH и остановить процессор.
Задание 3. Произвести логическое сложение чисел 01Н и F2H, записать результат в ячейку памяти по адресу 1088Н и остановить процессор.
Задание 4. Обменять содержимое ячеек памяти с адресами 1091Н и 1092Н и остановить процессор.
Задание 5. Инвертировать содержимое ячеек памяти с адресами 1056Н и 1079Н и остановить процессор.
Задание 6. Из содержимого регистра B вычесть содержимое регистра С, записать разность в ячейку памяти по адресу 1088Н. Осуществить переход на адрес 10А0Н, где произвести остановку процессора.
Задание 7. Осуществить логическое сложение чисел 90Н (записано в ячейку памяти по адресу 1030Н) и 0FН и перейти по адресу 1080Н для остановки процессора, если число единиц а результате чётно.
Задание 8. Обнулить аккумулятор. перейти по адресу 1077Н по условию, что А=0, где произвести загрузку в аккумулятор число 03Н и осуществить операцию логического сложения по модулю 2 с числом 38Н, результат сдвинуть на один разряд вправо и остановить процессор.
Задание 9. Загрузить в аккумулятор число 1СН. Сдвигать содержимое аккумулятора влево до появления признака переноса (CY=1), по которому осуществить переход на адрес 1075Н, где произвести очистку аккумулятора, сброс признака переноса и остановку процессора.
Задание 10. Загрузить в аккумулятор число 08Н. Выделить третий разряд аккумулятора а3 и, если он не равен нулю, осуществить переход на адрес 109АН, где поместить содержимое аккумулятора в ячейку памяти по адресу 1032Н и остановить процессор.
Задание 11. Сохранить в стеке содержимое регистровой пары PSW, загрузить в аккумулятор число 0BH и переслать его в регистровую пару HL. Вернуть содержимое регистровой паре PSW из стека и остановить процессор.
Задание 12. Загрузить в стек содержимое регистровых пар PSW, DE, HL и остановить процессор.
Задание 13. Загрузить в стек содержимое ячеек памяти с адресами 1090Н и 1091Н.
Задание 14. Загрузить в стек числа 1234Н и 5678Н и остановить процессор.
Задание 15. Сохранить значение вершины стека в регистровой паре DE. Установит значение вершины стека 10BBH и остановить процессор.
Задание 16. Перейти на подпрограмму по адресу 1045Н для инвертирования содержимого аккумулятора, вернуться из подпрограммы и остановить процессор.
Задание 17. Перейти на подпрограмму по адресу 1000Н, по которой из содержимого ячейки памяти с адресом 1056Н вычесть число 0FFH и выйти из подпрограммы, если результат окажется отрицательным, в обоих случаях остановить процессор.
Задание 18. наращивать содержимое аккумулятора на 40Н до появления признака переноса, по которому осуществить переход на подпрограмму обнуления регистровой пары HL, вернуться из подпрограммы и остановить процессор.
Задание 19. Обнулить аккумулятор. Осуществить переход на подпрограмму по адресу 1070Н, если флаг Z=1,по которой содержимое ячейки памяти с адресом 1050Н записать в следующую ячейку памяти и выйти из подпрограммы, если флаг Z всё ещё установлен. После чего остановить процессор.
Задание 20. Перейти на подпрограмму по адресу 1056Н, по которой перейти на подпрограмму по адресу 1А34Н, по которой установить все биты регистровой пары PSW. Выйти из второй подпрограммы и инвертировать аккумулятор. Выйти из первой подпрограммы и остановить процессор.