ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.02.2024
Просмотров: 17
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Индивидуальное задание №2
В заданиях для заданного варианта (табл. 2) требуется разработать структурную схему алгоритма программы. Ассемблировать вручную программу. И продемонстрировать ее работоспособность, выполнив ее на микроЭВМ. Дать описание всех команд своей программы.
Коды команд размещать в памяти с адресами 5000h, а данные — с адресами 6000h.
Табл 2 (вариант №6)
6 | Умножение 16-битных сомножителей. Множитель в регистрах DE, множимое в регистрах ВС, произведение возвращается в регистрах DE–HL. | |||
| ; | | | |
| LXI | D,2222h | ;В регистрах DE множитель | |
| LXI | B,3333h | ;В регистрах ВС множимое | |
| CALL | MUL16 | ;Вызов подпрограммы | |
| HLT | | ;Останов | |
MUL16: | MVI | A,l0h | ;Образовать счетчик бит | |
| LXI | H,0000h | ;Инициировать регистры HL | |
| PUSH | H | ;и стек | |
LOOP: | XCHG | | ;Множитель в HL, младшая часть произведения в DE | |
| DAD | H | ;Сдвинуть множитель влево | |
| XCHG | | ;Вернуть множитель и произведение | |
| JNC | NOADD | ;Бит множителя равен 0 | |
| DAD | В | ;Прибавить множимое | |
| JNC | NOADD | ;Переноса не возникло | |
| XTHL | | ;Старшая часть произведения в HL | |
| INX | H | ;Передать 1 в HL | |
| XTHL | | ;Младшая часть произведения в HL | |
NOADD: | DCR | A | ;Декремент счетчика бит | |
| JNZ | MORE | ;Продолжить умножение | |
| POP | D | ;Старшая часть произведения в DE | |
| RET | | ;Возврат из подпрограммы | |
MORE: | DAD | H | ;Сдвинуть младшую часть произведения | |
| XTHL | | ;Старшая часть произведения в HL | |
| PUSH | PSW | ;Сохранить флаги в стеке | |
| DAD | H | ;Сдвинуть старшую часть произведения | |
| POP | PSW | ;Вернуть флаги | |
| JNC | NOC | ;1 в младшей части нет | |
| INX | H | ;Передать 1 из младшей части | |
| NOC | XTHL | ;Обменять части произведения | |
| JMP | LOOP | ;Повторять умножение |
Текст программы
;umn161.asm
;Umnozhenie 16-bitny`kh somnozhitelei`. Mnozhitel` v registrakh DE, mnozhimoe v registrakh VS, ;proizvedenie vozvrashchaetsia v registrakh DE–HL.
DEFSEG MAINSEG,CLASS=CODE,START=5000h
SEG MAINSEG
; stack
MVI H, 0FFH
MVI L, 0AAH
SPHL
; pervy`i` somnozhitel`
LXI H,2222h
XCHG
;vtoroi` somnozhitel`
LXI B,3333h ;V registrakh VS mnozhimoe
; ozhidaemy`i` rezul`tat = 06D3 92C6h = 114528966
CALL MUL16 ;Vy`zov podprogrammy`
HLT ;Ostanov
MUL16: MVI A,10h ;Obrazovat` schetchik bit
LXI H,0000h ;Initciirovat` registry` HL
PUSH H ;i stek
LOOP: XCHG ;Mnozhitel` v HL, mladshaia chast` proizvedeniia v DE
DAD H ;Sdvinut` mnozhitel` vlevo
XCHG ;Vernut` mnozhitel` i proizvedenie
JNC NOADD ;Bit mnozhitelia raven 0
DAD B ;Pribavit` mnozhimoe
JNC NOADD ;Perenosa ne vozniclo
XTHL ;Starshaia chast` proizvedeniia v HL
INX H ;Peredat` 1 v HL
XTHL ;Mladshaia chast` proizvedeniia v HL
NOADD: DCR A ;Dekrement schetchika bit
JNZ MORE ;Prodolzhit` umnozhenie
POP D ;Starshaia chast` proizvedeniia v DE
RET ;Vozvrat iz podprogrammy`
MORE: DAD H ;Sdvinut` mladshuiu chast` proizvedeniia
XTHL ;Starshaia chast` proizvedeniia v HL
PUSH PSW ;Sokhranit` flagi v steke
DAD H ;Sdvinut` starshuiu chast` proizvedeniia
POP PSW ;Vernut` flagi
JNC NOC ;1 v mladshei` chasti net
INX H ;Peredat` 1 iz mladshei` chasti
NOC: XTHL ;Obmeniat` chasti proizvedeniia
JMP LOOP ;Povtoriat` umnozhenie
END
Описание алгоритма умножения:
Программа использует алгоритм умножения столбиком.
Умножение заменяется сдвигом (DAD H эквивалентно умножению на 2 или сдвигу влево
на 1 разряд). Сдвиг и сложение производится 16 раз (счетчик на 16 находится в аккумуляторе и декрементируется на 1 за цикл). При достижении А=0 умножение заканчивается.
Скриншот №1 Состояние в начале программы
Скриншот №2 Состояние в конце программы. Как видно, в регистрах
DE и HL находится правильное 4-х байтовое произведение = 06D3 92C6h
Вывод: программа работает правильно.
Примечание: применен ассемблер и отладчик avsim85.exe (for DOS).