Команда RST N является командой CALL addr специализированной на работе с прерываниями. Подпрограммы обработки прерываний обычно располагаются по фиксированным адресам, что позволяет сократить размер команды обращения к ним до одного байта.
Программа 10
Программа демонстрирует работу нескольких прерывающих друг друга вложенных программ.
Адрес |
Команда |
Мнемоника |
Комментарии |
000 |
061 |
LXI SP |
Инициализация указателя стека |
001 |
067 |
В2 |
|
002 |
000 |
В3 |
|
003 |
317 |
RST 1 |
Вызов подпрограммы 1 |
004 |
166 |
HLT |
Останов |
010 |
327 |
RST 2 |
Вызов подпрограммы 2 |
011 |
311 |
RET |
Возврат из подпрограммы 1 |
020 |
337 |
RST 3 |
Вызов подпрограммы 3 |
021 |
311 |
RET |
Возврат из подпрограммы 2 |
030 |
347 |
RST 4 |
Вызов подпрограммы 4 |
031 |
311 |
RET |
Возврат из подпрограммы 3 |
040 |
357 |
RST 5 |
Вызов подпрограммы 5 |
041 |
311 |
RET |
Возврат из подпрограммы 4 |
050 |
311 |
RET |
Возврат из подпрограммы 5 |
Индивидуальное задание 1
Реализовать подсчёт количества отрицательных чётных чисел в массиве из 16-ти.
Алгоритм программы:
Создаём массив из 16-ти знаковых чисел(начиная с 200-го адреса, если в старшем бите 1-ца, число отрицательное). Непосредственно загружаем в В-пару регистров число 16 – количество чисел в массиве(C => 020, т.к. система 8-я, B => 000). Загружаем в D-пару адрес массива(сначала адрес первого числа, Е => 200, D => 000). Косвенно загружаем аккумулятор D-парой. Складываем аккумулятор с 0(A + B) для получения флагов, после чего идёт проверка флага S(знак числа, смотрит на старший бит байта). Число положительное – идёт переход через несколько адресов вперёд, отрицательное – оно сдвигается вправо и анализируется выдвигаемый бит. Если число нечётное(выдвинутый бит 1) – переход через несколько адресов вперёд, чётное – идёт на следующую команду инкрементирования счётчика(В). Дальше идёт инкремент адресного регистра Е для перехода на следующее число в массиве и его анализа. Декрементируем регистр количества чисел массива С(на эту операцию идёт переход, если число положительное или нечётное) и осуществляем переход по флагу Z(если Z=0, т.е. в регистре С не 0, тогда идёт переход к косвенной загрузке в D-пару аккумулятора). Если регистр С обнулился и цикл закончен, тогда загружаем в H-пару адрес, где будет хранится результат(т.к. регистры мы читать не можем) и переписываем в память по этому адресу регистр В, после чего идёт зацикливание.
Адрес |
Команда |
Мнемоника |
Адрес |
Команда |
Мнемоника |
000 |
001 |
LXI B |
016 |
021 |
B2 |
001 |
020 |
B2 |
017 |
000 |
B3 |
002 |
000 |
B3 |
020 |
004 |
INR B |
003 |
021 |
LXI D |
021 |
034 |
INR E |
004 |
200 |
B2 |
022 |
015 |
DCR C |
005 |
000 |
B3 |
023 |
302 |
JNZ |
006 |
032 |
LDAX D |
024 |
006 |
B2 |
007 |
306 |
ADI |
025 |
000 |
B3 |
010 |
000 |
B2 |
026 |
041 |
LXI H |
011 |
362 |
JP |
027 |
300 |
B2 |
012 |
021 |
B2 |
030 |
000 |
B3 |
013 |
000 |
B3 |
031 |
160 |
MOV M, B |
014 |
017 |
RRC |
032 |
166 |
HLT |
015 |
332 |
JC |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.