Программа последовательно вызывает подпрограммы с 1 по 5, после чего выполняет выход из каждой подпрограммы в порядке вложенности (сначала из 5, затем из 4 и т.д.) Если убрать инструкцию RET по адресу 050, то выхода из подпрограммы не произойдет, и будет выполняться инструкция по следующему адресу.
Выполнение индивидуального задания – вычисление произведения двух 8-разрядных чисел старшими разрядами вперед с индикацией сомножителей и произведения
Рис. 3. Схема алгоритма произведения чисел старшими разрядами вперед со сдвигом суммы.
Описание алгоритма индикации
1. Производится инициализация путем вывода служебных данных в служебные порты.
2. Производится индикация восьмеричных разрядов сомножителей. Для выделения разрядов используется тройной сдвиг вправо и логическое умножение на маску.
3. Реализуется задержка путем декрементирования записанных в регистровой паре данных и проверки на равенство нулю.
4. Производится индикация восьмеричных разрядов произведения по тому же принципу, что и в п.2.
В программе объединены задания по вычислению произведения двух чисел и индикации. Листинг готовой программы приведен в таблице 11.
Таблица 11.
Адреса (L) |
Команды |
Мнемоника команд |
Комментарии |
000 |
041 |
LXI H |
;Инициализация начального адреса памяти адресом операнда А: 000 200 |
001 |
200 |
B2 |
|
002 |
000 |
B3 |
|
003 |
116 |
MOV С, M |
;Загрузка первого сомножителя в С |
004 |
043 |
INX H |
|
005 |
136 |
MOV E, M |
;Загрузка второго сомножителя в Е |
006 |
056 |
MVI L |
;Очистка регистра L |
007 |
000 |
B2 |
|
010 |
026 |
MVI D |
;Загрузка в D переменной-счетчика = 8 |
011 |
010 |
B2 |
|
012 |
175 |
MOV A, L |
;Загрузка младшей части частичного произведения в аккумулятор |
013 |
303 |
JMP |
;Безусловный переход на «заплатку» |
014 |
050 |
B2 |
;на адрес 000 050 |
015 |
000 |
B3 |
|
016 |
174 |
MOV A, H |
;Загрузка старшей части частичного произведения в аккумулятор |
017 |
027 |
RAL |
|
020 |
147 |
MOV H, A |
|
021 |
173 |
MOV A, E |
|
022 |
007 |
RLC |
|
023 |
137 |
MOV E, A |
|
024 |
322 |
JNC |
;Если сдвинутый разряд = 1, складываем частичное произведение с A |
025 |
030 |
B2 |
|
026 |
000 |
B3 |
|
027 |
011 |
DAD B |
;Сложение 16-разрядных чисел |
030 |
025 |
DCR D |
;Декремент счетчика |
031 |
302 |
JNZ |
;Проверка условия выхода из цикла |
032 |
012 |
B2 |
;Если Z=0 – переход на адрес 000 012 |
033 |
000 |
B3 |
|
034 |
174 |
MOV A, H |
;Загрузка старшей части частичного произведения в аккумулятор |
035 |
062 |
STA |
;Сохранение в памяти по адресу 000 202 |
036 |
202 |
B2 |
|
037 |
000 |
B3 |
|
040 |
175 |
MOV A, L |
;Загрузка младшей части частичного произведения в аккумулятор |
041 |
062 |
STA |
;Сохранение в памяти по адресу 000 203 |
042 |
203 |
B2 |
|
043 |
000 |
B3 |
;Вычисление произведения окончено |
044 |
303 |
JMP |
;Безусловный переход на адрес 000 220 |
045 |
220 |
B2 |
|
046 |
000 |
B3 |
|
047 |
|||
050 |
067 |
STC |
;Установка флага C |
051 |
077 |
CMC |
;Инверсия – C = 0 |
052 |
027 |
RAL |
|
053 |
157 |
MOV L, A |
|
054 |
303 |
JMP |
; Безусловный переход обратно – на адрес |
055 |
016 |
B2 |
; 000 016 |
056 |
000 |
B3 |
|
057 |
|||
060 |
171 |
MOV A, C |
;Подпрограмма1 |
061 |
303 |
JMP |
;Безусловный переход на «заплатку» – |
062 |
100 |
B2 |
;на адрес 000 100 |
063 |
000 |
B3 |
|
064 |
205 |
ADD L |
;Прибавляем к 300 смещение – число |
065 |
157 |
MOV L, A |
|
066 |
176 |
MOV A, M |
;Считываем из памяти в аккумулятор код цифры |
067 |
311 |
RET |
|
070 |
171 |
MOV A, C |
;Подпрограмма2 – сдвиг на 3 разряда вправо |
071 |
017 |
RRC |
|
072 |
017 |
RRC |
|
073 |
017 |
RRC |
|
074 |
117 |
MOV C, A |
|
075 |
311 |
RET |
|
100 |
056 |
MVI L |
;300->L |
101 |
300 |
B2 |
|
102 |
346 |
ANI |
;Логическое умножение на маску - 007 |
103 |
007 |
B2 |
;Чтобы оставить один восьмеричный разряд |
104 |
303 |
JMP |
;Безусловный переход по адресу 000 064 |
105 |
064 |
B2 |
|
106 |
000 |
B3 |
|
;Индикация |
|||
220 |
076 |
MVI A |
;Инициализация |
221 |
200 |
B2 |
;200->A |
222 |
323 |
OUT |
;Вывод в служебный порт |
223 |
003 |
PORT |
|
224 |
323 |
OUT |
;Вывод в служебный порт |
225 |
007 |
PORT |
|
226 |
041 |
LXI H |
;200->L, 000->H |
227 |
200 |
B2 |
|
230 |
000 |
B3 |
|
231 |
116 |
MOV C, M |
|
232 |
367 |
RST 6 |
|
233 |
323 |
OUT |
;Вывод первого сомножителя |
234 |
004 |
PORT |
;Вывод младшего разряда |
235 |
377 |
RST 7 |
|
236 |
367 |
RST 6 |
|
237 |
323 |
OUT |
;Вывод среднего разряда |
240 |
005 |
PORT |
|
241 |
377 |
RST 7 |
|
242 |
346 |
ANI |
;Логическое умножение на маску - 003 |
243 |
003 |
B2 |
|
244 |
117 |
MOV C, A |
|
245 |
367 |
RST 6 |
|
246 |
323 |
OUT |
;Вывод старшего разряда |
247 |
006 |
PORT |
;Вывели первый сомножитель |
250 |
041 |
LXI H |
;201->L, 000->H |
251 |
201 |
B2 |
|
252 |
000 |
B3 |
|
253 |
116 |
MOV C, M |
|
254 |
367 |
RST 6 |
|
255 |
323 |
OUT |
;Вывод второго сомножителя |
256 |
000 |
PORT |
;Вывод младшего разряда |
257 |
377 |
RST 7 |
|
260 |
367 |
RST 6 |
|
261 |
323 |
OUT |
;Вывод среднего разряда |
262 |
001 |
PORT |
|
263 |
377 |
RST 7 |
|
264 |
346 |
ANI |
;Логическое умножение на маску - 003 |
265 |
003 |
B2 |
|
266 |
117 |
MOV C, A |
|
267 |
367 |
RST 6 |
|
270 |
323 |
OUT |
;Вывод старшего разряда |
271 |
002 |
PORT |
;Вывели второй сомножитель |
272 |
303 |
JMP |
;Безусловный переход на следующую часть программы – по адресу 000 350 |
273 |
350 |
B2 |
|
274 |
000 |
B3 |
|
300 |
077 |
;Цифра 0 |
|
300 |
006 |
;Цифра 1 |
|
300 |
133 |
;Цифра 2 |
|
300 |
117 |
;Цифра 3 |
|
300 |
146 |
;Цифра 4 |
|
300 |
155 |
;Цифра 5 |
|
300 |
175 |
;Цифра 6 |
|
300 |
007 |
;Цифра 7 |
|
350 |
001 |
LXI B |
;Задержка и вывод произведения |
351 |
377 |
B2 |
;Установка в 1 всех бит регистровой пары BC |
352 |
377 |
B3 |
;377->B, 377->C |
353 |
013 |
DCX B |
|
354 |
170 |
MOV A, B |
|
355 |
376 |
CPI |
;Сравнение старшего разряда с 000 |
356 |
000 |
B2 |
|
357 |
302 |
JNZ |
;Если Z=0 – переход по адресу 000 353 |
360 |
353 |
B2 |
|
361 |
000 |
B3 |
|
362 |
041 |
LXI H |
;202->L, 000->H |
363 |
202 |
B2 |
|
364 |
000 |
B3 |
|
365 |
116 |
MOV C, M |
|
366 |
367 |
RST 6 |
|
367 |
323 |
OUT |
;Вывод 3 разряда |
370 |
004 |
PORT |
|
371 |
377 |
RST 7 |
|
372 |
367 |
RST 6 |
|
373 |
323 |
OUT |
;Вывод 4 разряда |
374 |
005 |
PORT |
|
375 |
377 |
RST 7 |
|
376 |
346 |
ANI |
;Логическое умножение на маску - 003 |
377 |
003 |
B2 |
|
1000 |
117 |
MOV C, A |
|
1001 |
367 |
RST 6 |
|
1002 |
323 |
OUT |
Вывод 5 разряда |
1003 |
006 |
PORT |
|
1004 |
041 |
LXI H |
;203->L, 000->H |
1005 |
203 |
B2 |
|
1006 |
000 |
B3 |
|
1007 |
116 |
MOV C, M |
|
1010 |
367 |
RST 6 |
|
1011 |
323 |
OUT |
;Вывод 0 разряда |
1012 |
000 |
PORT |
|
1013 |
377 |
RST 7 |
|
1014 |
367 |
RST 6 |
|
1015 |
323 |
OUT |
;Вывод 1 разряда |
1016 |
001 |
PORT |
|
1017 |
377 |
RST 7 |
|
1020 |
346 |
ANI |
;Логическое умножение на маску - 003 |
1021 |
003 |
B2 |
|
1022 |
117 |
MOV C, A |
|
1023 |
367 |
RST 6 |
|
1024 |
323 |
OUT |
;Вывод 2 разряда |
1025 |
002 |
PORT |
|
1026 |
166 |
HLT |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.