2.2 Распределение памяти и листинг программы с комментарием
SP-двухбайтный регистр стека
H,L - пара регистров, занятых массивом исходных чисел
D,E - пара регистров, занятых результирующего массива.
В, С - пара регистров, используемых для хранения временных данных
С - регистр, используемый как счетчик
адрес | данные | Код ассемблера | Комментарии |
31 00 80 | LXI SP, 8000h | Создание стека программы по адресу 8000h | |
21 05 50 | LXI H, 5001h | Помещение в пару H,L адреса исходного массива | |
11 01 70 | LXI D, 7001h | Помещение в пару D,E адреса массива результатов | |
01 00 60 | LXI B, 6000h | Помещение в пару В, С ячейку памяти 6000h | |
400C | AF | XRA A | Обнуление аккумулятора |
400D | STAX B | Запись содержимого в ячейку памяти 6000h | |
400E | 0E 0A | MVI C,0Ah | Создание счетчика на 10 шагов |
C5 | M1: PUSH B | Засылка содержимого регистров В, С в стек | |
7E | MOV A,M | Копирование содержимого регистров в аккумулятор | |
RAL | Циклический сдвиг содержимого аккумулятора влево на один разряд | ||
DA 50 40 | JC OTR | Если число отрицательное (CY=1), то прыгнуть на метку OTR | |
7E | MOV A,M | Копирование содержимого ячейки памяти в аккумулятор | |
STAX D | Запись в массив результатов старшего байта числа | ||
2B | DCX H | Переход к младшему байту числа в исходном массиве | |
1B | DCX D | Переход к младшему байту числа в массиве результатов | |
401A | 7E | MOV A,M | Копирование содержимого ячейки памяти в аккумулятор |
401B | STAX D | Запись в массив результатов младшего байта числа | |
401C | INX H | С адреса 401С по 4021 - продвижение адресов на следующую пару чисел в исходном массиве и в массиве результатов | |
401D | INX D | ||
401E | M2: INX H | ||
401F | INX D | ||
INX H | |||
INX D | |||
C1 | POP B | Извлечение содержимого В, С из стека | |
0D | DCR C | Уменьшение счетчика на 1 | |
C2 10 40 | JNZ M1 | Возврат на М1 до исчерпания счетчика | |
CD 80 40 | CALL PODS | Вызов подпрограммы PODS | |
402A | CD 49 00 | CALL 49h | Перевод курсора на новую строку |
402D | CD 90 40 | CALL VISX | Вызов программы VISX |
CD 49 00 | CALL 49 h | Перевод курсора на новую строку | |
CD B0 40 | CALL VREZ | Вызов подпрограммы VREZ | |
C3 40 00 | JMP 40h | Выход в программу Монитор |
Подпрограмма обработки отрицательных чисел
0A | PODS: LDAX B | Загрузка в аккумулятор содержимого ячейки 6000h | |
01 20 41 | LXI B,4120h | Помещение в пару регистров В, С адреса 4120h | |
CD 4C 00 | CALL 4Ch | Вывод строки текста, начиная с адреса, записанного в В, С до нулевого байта | |
CD 61 00 | CALL 61h | Вывод двух шестнадцатеричных цифр и аккумулятора | |
408A | C9 | RET | Безусловный возврат к команде, с адресом 402А |
Подпрограмма вывода на экран исходного массива
409011 14 00VISX: LXI D, 0014hСоздание счетчика на 20 шагов | |||
21 00 50 | LXI H, 5000h | Помещение в пару H,L адреса исходного массива | |
01 20 42 | LXI B,4220h | Помещение в пару регистров В, С адреса 4220h | |
CD 4C 00 | CALL 4Ch | Вывод строки текста, начиная с адреса, записанного в В, С до нулевого байта | |
409С | 01 20 43 | LXI B,4320h | Помещение в пару регистров В, С адреса 4320h |
409F | 7E | MOV A,M | Копирование содержимого ячейки памяти в аккумулятор |
40A0 | CD 61 00 | CALL 61h | Вывод двух шестнадцатеричных цифр и аккумулятора |
40A3 | INX H | Продвижение адреса на следующую пару чисел | |
40A4 | CD 4C 00 | CALL 4Ch | Вывод строки текста, начиная с адреса, записанного в В, С до нулевого байта |
40A7 | 1D | DCR E | Уменьшение счетчика на 1 |
40A8 | C2 9F 40 | JNZ 409F | Возврат в 409F до исчерпания счетчика |
40AB | C9 | RET | Безусловный возврат к команде, адресом 4030 |
Подпрограмма вывода на экран массива результатов
40B011 14 00VREZ: LXI D,0014hСоздание счетчика на 20 шагов | |||
40B3 | 21 00 70 | LXI H, 7000h | Помещение в пару H,L адреса массива результатов |
40B6 | 01 20 44 | LXI B, 4420h | Помещение в пару регистров В, С адреса 4420h |
40B9 | CD 4C 00 | CALL 4Ch | Вывод строки текста, начиная с адреса, записанного в В, С до нулевого байта |
40BC | 01 20 43 | LXI B, 4320h | Помещение в пару регистров В, С адреса 4320h |
40BF | 7E | MOV A,M | Копирование содержимого ячейки памяти в аккумулятор |
40C0 | CD 61 00 | CALL 61h | Вывод двух шестнадцатеричных цифр и аккумулятора |
40C3 | INX H | Продвижение адреса на следующую пару чисел | |
40C4 | CD 4C 00 | CALL 4Ch | Вывод строки текста, начиная с адреса, записанного в В, С до нулевого байта |
40C7 | 1D | DCR E | Уменьшение счетчика на 1 |
40C8 | C2 BF 40 | JNZ 40BF | Возврат в 40BF до исчерпания счетчика |
40CB | C9 | RET | Безусловный возврат к команде, с адресом 4036 |
· Результаты тестирования программы
При запуске программы, на экране Монитора выводятся следующие данные: