Файл: Индивидуальное задание 2.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 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).