Программа последовательно вызывает подпрограммы с 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).
Ссылка на скачивание - внизу страницы.