Программы умножения двоичных чисел. Подпрограмма умножения целых двоичных чисел без знака. Ячейка ПД для временного хранения

Страницы работы

22 страницы (Word-файл)

Фрагмент текста работы

Программы умножения двоичных чисел

; ***************************************************************

; ---------------------------- M16_8 ---------------------------------------------------------

; Подпрограмма умножения целых двоичных чисел без знака

; формата 16´8=24.

; Входные параметры: (R4,R3) – СТБ,МЛБ множимого, (R2) – множитель.

; Выходные параметры: (R5,R4,R3) – СТБ,СРБ,МЛБ произведения.

;****************************************************************

M16_8:

MOV   A, R2

MOV   B, R3

MUL   AB         

MOV   R3, А

;

(R3) – МЛБ произведения

MOV   R7, В

MOV   A, R2

MOV   B, R4

MUL   AB        

ADD   A, R7

MOV   R4, A       

;

(R4) – СРБ произведения

MOV   A, В

ADDC   A, #0

MOV   R5, A        

;

(R5) – СТБ произведения

RET

; ***************************************************************

; ---------------------------- M16_16 -------------------------------------------------------

; Подпрограмма умножения целых двоичных чисел без знака

; формата 16´16=32.

; Входные параметры: (R7,R6) – СТБ,МЛБ множителя,  

;                                     (R5,R4) – СТБ,МЛБ множимого.

; Выходные параметры: (R7,R6,R3,R2) – СТБ,…,МЛБ произведения.

;****************************************************************

M16_16:

MOV   A, R4

MOV   B, R6

MUL   AB         

;

Хмл.´Yмл.

MOV   R3, B

MOV   R2, A

MOV   A, R5

MOV   B, R6

MUL   AB        

;

Хст.´Yст.

ADD   A, R3

MOV   R3, A       

;

(R3)=(R3)+(A)

CLR   A

ADDC   A, B

MOV   R6, A        

;

(R6)=0+(B)+C

MOV   A, R4

MOV   R1, A

CLR   A

ADDC   A, #0

MOV   R4, A       

;

(R4)=0+C

MOV   A, R1

MOV   B, R7

MUL   AB

ADD   A, R3

MOV   R3, A       

;

(R3)=(R3)+(A)

MOV   A, R6

ADDC   A, B

MOV   R6, A       

;

(R6)=(R6)+(B)+C

CLR   A

ADDC   A, R4

MOV   R4, A      

;

(R4)=(R4)+C

MOV   A, R5

MOV   B, R7

MUL   AB

ADD   A, R6

MOV   R6, A       

;

(R6)=(R6)+(A)

MOV   A, R4

ADDC   A, B     

;

(A)=(R4)+(B)+C

MOV   R7, A       

;

Результат в (R7,R6,R3,R2) – произведение

RET

; ***************************************************************

; --------------------------------- М16_16F -------------------------------------------------

; Подпрограмма умножения  дробных двоичных чисел без знака

; с фиксированной запятой формата 16´16=16.

; Входные параметры: (R7,R6) – СТБ,МЛБ множителя,  

;                                      (R5,R4) – СТБ,МЛБ множимого.

; Выходные параметры: (R7,R6) – СТБ,МЛБ произведения.

; Используется подпрограмма М16_16.

; ***************************************************************

М16_16F:    

CALL   М16_16

;

(R7,R6) – произведение

RET

; ***************************************************************

; --------------------------------- М16_16FS -----------------------------------------------

; Подпрограмма умножения  дробных двоичных чисел со знаком

; (в прямом коде) с фиксированной после знакового разряда запятой

; формата 16´16=16.

; Входные параметры: (R7,R6) – СТБ,МЛБ множителя,  

;                                      (R5,R4) – СТБ,МЛБ множимого.

; Выходные параметры: (R3,R2) – СТБ,МЛБ произведения.

; Используется подпрограмма M16_16.

; ***************************************************************

GG:    

EQU   20H

;

Ячейка ПД для временного хранения

; Проверка сомножителей на 0

М16_16FS:  

CLR   C

CLR   A

MOV   R0, #GG     

;

Адрес ячейки памяти для знака

MOV   R2, A

MOV   R3, A

ORL   A, R5

ORL   A, R4

JZ   MET2         

;

Если множимое = 0

MOV   A, R7

ORL   A, R6

JZ   MET2        

;

Если множитель = 0

; Анализ знаков сомножителей на совпадение

MOV   A, R5

XRL   A, R7       

;

S=0, если знаки одинаковы

MOV   @R0, A      

;

Сохранение знака

; Проверка знака множимого

MOV   A, R5

RLC   A

JNC   PER1       

;

Если знак "+"

MOV   A, R5

ANL   A, #7FH     

;

Запись в знаковый разряд "0"

MOV   R5, A      

;

в (R5) - модуль ст. тетрады

; Проверка знака множителя

PER1:  

MOV   A, R7

RLC   A

JNC   PER2       

;

Если знак "+"

MOV   A, R7

ANL   A, #7FH     

;

в знаковый разряд "0"

MOV   R7, A     

;

в (R7) – модуль ст. тетрады

; Беззнаковое умножение двоичных чисел 16´16=32

PER2:  

CALL   M16_16

; Сдвиг старших байтов произведения влево на 1 разряд

MOV   A, R3

RLC   A

MOV   A, R6

RLC   A

MOV   R2, A

MOV   A, R7

RLC   A

MOV   R3, A       

;

(R3,R2) – произведение

; Коррекция произведения

MOV   A, @R0      

;

Восстановление знака S

ANL   A, #80H

JZ   MET2        

;

Если "+"

MOV   A, R3

SETB   ACC.7     

;

"–" в знаковый разряд (А)

MOV   R3, A

MET2:  

RET

Программы деления двоичных чисел

; ***************************************************************

; --------------------------------- D16_8 -----------------------------------------------------

; Подпрограмма деления целых двоичных чисел без знака

; формата 16:8=(8,8).

; Входные параметры: (R4,R3) – СТБ,МЛБ делимого, (R2) – делитель.

; Выходные параметры: (R3) – частное, (R4) – остаток.

; ***************************************************************

D16_8:

MOV   В, #8

;

Счетчик циклов

; Сдвиг влево остатка и частного в R4,R3

CYCLE:

MOV   A, R3

ADD   A, R3

MOV   R3, A

MOV   A, R4

ADDC   A, R4

;

(А) – СТБ остатка

JC   PER1

;

Если переполнение остатка

; Вычитание делителя из остатка

SUBB   A,R2

JNC   PER2

;

Если разность > 0

; Разность < 0, восстановление остатка

ADD   A, R2

;

MOV   R4, А

JMP   PER3

; Переполнение остатка, разряд частного = 1

PER1:   

CLR   C

SUBB   A, R2

PER2:   

MOV   R4, A

INC   R3

;

+1 в частное

PER3:   

DJNZ   В, CYCLE

;

Зацикливание

RET

; ***************************************************************

; --------------------------------- D16_16 ---------------------------------------------------

; Подпрограмма деления целых двоичных чисел без знака

; формата 16:16 (делимое меньше делителя).

; Входные параметры: (R2,R3) – СТБ и МЛБ делимого (ДМ),

;                                      (R4,R5) – СТБ и МЛБ  делителя (ДЛ).

; Выходные параметры: (R6,R7) – СТБ и МЛБ  частного (ЧСТ),

;                                        (R2,R3) – СТБ и МЛБ  остатка (ОСТ).

; Используются регистры 0-го банка                                                                    ---------------------------------

D16_16:

MOV   В, #16

; Сдвиг частного (R6,R7) влево

LOOP:

MOV   A, R7

ADD   A, R7

MOV   R7, A

MOV   A, R6

ADDC   A, R6

MOV   R6, A

;

Сдвинутое частное (R6,R7)

; Сдвиг остатка (промежуточного делимого) (R2,R3) влево

MOV   A, R3

ADD   A, R3

MOV   R3, A

MOV   A, R2

ADDC   A, R2

MOV   R2, A

;

(R2,R3) – сдвинутый остаток

JC   PER1

;

Если переполнение остатка (C=1)

; Cложение остатка с дополнительным кодом делителя

PUSH   03H

;

Сохранение МЛБ остатка – R3

PUSH   02H

;

Сохранение СТБ остатка – R2

MOV   A, R3

ADD   A, R5

MOV   R3, A

MOV   A, R2

ADDC   A, R4

MOV   R2, A

JNC   PER2

;

Переход если сумма < 0

; Сумма > 0, в разряд частного записать 1

DEC   SP

;

DEC   SP

;

Баланс стека

MOV   A, R7

ADD   A, #1

MOV   R7, A

MOV   A, R6

ADDC   A, #0

MOV   R6, A

JMP   PER3

; Переполнение остатка, в разряд частного записать 1

PER1:   

MOV   A, R3

ADD   A, R5

MOV   R3, A

;

МЛБ нового остатка

MOV   A, R2

ADDC   A, R4

MOV   R2, A

;

СТБ нового остатка

MOV   A, R7

ADD   A, #1

MOV   R7, A

MOV   A, R6

ADDC   A, #0

MOV   R6, A

JMP   PER3

; Сумма < 0, восстановление остатка

PER2:   

POP   02H

;

(R2) – СТБ остатка

POP   03H

;

(R3) – МЛБ остатка

; Проверка конца цикла

PER3:   

DJNZ   В, LOOР

RET

; ***************************************************************

; -------------------------------- D16_16FS -------------------------------------------------

; Подпрограмма деления дробных двоичных чисел в дополнительном коде 

; с фиксированной  после знакового разряда запятой формата 16:16=16.

; (Делитель по абсолютной величине должен быть больше делимого).

; Входные параметры: (R7,R6) – делимое, в (R6) – младший байт,

;                                     (R5,R4) – делитель, в (R4) – младший байт.

; Выходные параметры: (R3,R2) – частное, в (R2) – младший байт.

; ***************************************************************

SAVE:

EQU   20H

;

Адрес ячейки для временного хранения

D16_16FS:

CLR   A

MOV   R2, A

MOV   R3, A

MOV   R0, #SAVE

MOV   R1, #16 

;

Счетчик циклов

; Анализ знаков остатка и делителя на совпадение

SNOV:

MOV   A, R7

XRL   A, R5

MOV   @R0, A

JB7   MET1

JC   PER1

CPL   C

JMP   PER1

MET1:

CLR   C

; Сдвиг влево остатка в (R7,R6) и частного в (R3,R2)

; Установка по CY=1 разряда частного

PER1:

MOV   A, R2

RLC   A

MOV   R2, A

MOV   A, R3

RLC   A

MOV   R3, A

MOV   A, R6

ADD   A, R6

MOV   R6, A

MOV   A, R7

ADDC   A, R7

MOV   R7, A

MOV   A, @R0

JB7   MET2

; Вычитание делителя из остатка при одинаковых знаках

MOV   A, R6

CPL   A

ADD   A, R4

CPL   A

MOV   R6, A

MOV   A, R7

CPL   A

ADDC   A, R5

CPL   A

MOV   R7, A

JMP   PER3

; Сложение остатка с делителем при разных знаках

MET2:

MOV   A, R6

ADD   A, R4

MOV   R6, A

MOV   A, R7

ADDC   A, R5

MOV   R7, A

PER3:

DJNZ   R1, SNOV  

;

Проверка конца цикла

; Коррекция знака частного

MOV   A, R3

ADD   A, #80Н

MOV   R3, A

RET

; ***************************************************************

; ----------------------------------D16_16A-------------------------------------------------

; Подпрограмма деления целых двоичных чисел без знака

; формата 16:16=16.

; Входные параметры: (R7,R6) - СТБ, МЛБ делимого,

;                                      (R3,R2) - СТБ, МЛБ делителя.

; Выходные параметры: (R5,R4) - СТБ, МЛБ  частного,

;                                         (R7,R6) - СТБ, МЛБ остатка.

; ***************************************************************

KL:

EQU   20H

;

;

Адрес ячейки ПД для временного хранения

D16_16А:

CLR   A

MOV   R4, A

MOV   R5, A

;

Очистка частного

MOV   R1, #16

;

Счетчик циклов

; Дополнение делителя

MOV   A, R2

CPL   A

ADD   A, #1

MOV   R2, A

MOV   A, R3

CPL   A

ADDC   A, #0

MOV   R3, A

; Сдвиг частного (R5,R4) и остатка (R7,R6) влево

RED:

MOV   A, R4

ADD   A, R4

MOV   R4, A

MOV   A, R5

ADDC   A, R5

MOV   R5, A

MOV   A, R6

ADD   A, R6

MOV   R6, A

MOV   A, R7

ADDC   A, R7

MOV   R7, A

JC   MT1          

;

Если переполнение остатка

; Сложение остатка с дополнительным кодом делителя

MOV   R0, #KL     

;

Сохранение

MOV   A, R6       

;

MOV   @R0, A      

;

INC   R0         

;

MOV   A, R7       

;

MOV   @R0, A      

;

MOV   A, R2       

;

остатка

ADD   A, R6

MOV   R6, A

MOV   A, R3

ADDC   A, R7

MOV   R7, A

JNC   MT2

; Сумма > 0, разряд частного = 1

DEC   R0

MOV   A, R4

ADD   A, #1

MOV   R4, A

MOV   A, R5

ADDC   A, #0

MOV   R5, A

JMP   MT3

; Переполнение остатка, разряд частного = 1

MT1:   

MOV   A, R2

ADD   A, R6

MOV   R6, A

MOV   A, R3

ADDC   A, R7

MOV   R7, A

MOV   A, R4

ADD   A, #1

MOV   R4, A

MOV   A, R5

ADDC   A, #0

MOV   R5, A

JMP   MT3

; Сумма < 0, восстановление остатка

MT2:   

MOV   A, @R0

MOV   R7, A

DEC   R0

MOV   A, @R0

MOV   R6, A

; Проверка конца цикла

MT3:   

DJNZ   R1, RED

RET

; ***************************************************************

; ----------------------------------D32_16---------------------------------------------------

; Подпрограмма деления целых двоичных чисел без знака

; формата 32:16=(16,16)

; Входные параметры: (R7,R6, R5,R4) - СТБ, … , МЛБ делимого,

;                                      (R3,R2) - СТБ, МЛБ делителя.

; Выходные параметры: (R5,R4) - СТБ,МЛБ частного,

;                                         (R7,R6) - СТБ,МЛБ остатка.

; ***************************************************************

; Проверка частного на переполнение

D32_16:

CLR   C

MOV   A, R6

SUBB   A, R2

MOV   A, R7

SUBB   A, R3

JNC   EXIT

;

Если переполнение С=0

MOV   R1, #16

;

Счетчик циклов

; Сдвиг влево остатка и частного в R7,R6, R5,R4

CYCLE:

MOV   A, R4

ADD   A, R4

MOV   R4, A

MOV   A, R5

ADDC   A, R5

MOV   R5, A

MOV   A, R6

ADDC   A, R6

MOV   R6, A

MOV   A, R7

ADDC   A, R7

MOV   R7, A

MOV   F0, C

;

Запоминание переноса С

; Вычитание делителя из остатка

PER1:

CLR   C     

MOV   A, R6       

SUBB   A, R2

MOV   R6, A

MOV   A, R7       

SUBB   A, R3

MOV   R7, A

; Проверка знака разности

JC   PER2

;

Если разность < 0

PER3:

MOV   A, R4

;

Разряд частного = 1

ADD   A, #1

MOV   R4, A

MOV   A, R5

ADDC   A, #0

MOV   R5, A

JMP   PER4

; Проверка переноса от сдвига остатка

PER2:

MOV   C,  F0

;

Восстановление переноса

JC   PER3

;

Если был перенос

; восстановление остатка

MOV   A, R6       

ADD   A, R2

MOV   R6, A

MOV   A, R7

ADDC   A, R3

MOV   R7, A

; Проверка конца цикла

PER4:

DJNZ   R1, CYCLE

SETB   С

EXIT:

RET

; ***************************************************************

; --------------------------------- D16_16F--------------------------------------------------

; Подпрограмма деления дробных двоичных чисел без знака с ФЗ

; формата 16:16=16.

; Входные параметры: (R2,R3) – СТБ,МЛБ делимого,

;                                      (R4,R5) – СТБ,МЛБ  делителя.

; Выходные параметры: (R6,R7) – СТБ,МЛБ  частного.

; Используется подпрограмма D16_16.                                      

; ***************************************************************

D16_16F:

CALL   D16_16

;

(R6,R7) – частное

RET

; ***************************************************************

; --------------------------------- D16_16AF--------------------------------------------------

; Подпрограмма деления дробных двоичных чисел без знака с ФЗ

; формата 16:16=16.

; Входные параметры: (R7,R6) – СТБ,МЛБ делимого,

;                                      (R3,R2) – СТБ,МЛБ  делителя.

; Выходные параметры: (R5,R4) – СТБ,МЛБ  частного.

; Используется подпрограмма D16_16A.                                      

; ***************************************************************

D16_16AF:

CALL   D16_16A

;

(R5,R4) – частное

RET

Программы преобразования представления чисел

;****************************************************************

; -------------------------------- С8_10------------------------------------------------------

; Подпрограмма преобразования двоичного целого числа без знака

; формата 8 в двоично-десятичное число формата 3´4.

; Входной параметр: (А) –двоичное число.

; Выходные параметры: (R7,R6) – двоично-десятичное число (0Р2,Р1Р0).

;****************************************************************

С8_10:

MOV   В, #100

;

Разделить двоичное число на 100

DIV   AB

MOV   R7, A

MOV   A, #10

;

Разделить остаток на 10

XCH   A, B

;

Цифра десятков в А

DIV   AB

;

Остаток – число единиц

SWAP   A

ADD   A, B

;

(А) – цифра в BCD-коде

MOV   R6, A

RET

; ***************************************************************

 

; ------------------------------ C10_8 -------------------------------------------------------

 

; Подпрограмма преобразования целого двоично-десятичного числа без 

; знака формата 2*4 в двоичное число формата 8.

; Входной параметр: (А) – двоично-десятичное число.

; Выходной параметр:  (А) – двоичное число.

 

; ***************************************************************

 

C10_8:

CALL   DIV16

;

Деление исходного кода на 16

SWAP   A

;

Передача остатка в старшую тетраду

;

аккумулятора

ORL   A, R1

;

Загрузка частного в младшую тетраду

;

аккумулятора

SWAP   A

;

;

Формирование результата в аккумуляторе

RET

;

Выход

; Подпрограмма деления на 16

; Делимое в аккумуляторе

; Результат: (R1) - частное, (А) - остаток

DIV16:

MOV   R1, #0  

;

Сброс частного

SUB16:

ADD   A, #84Н    

;

;

Вычитание из делимого числа 16, представленного в десятичной системе

DА  А

INC R1

;

Инкремент частного

JC   SUB16

;

Цикл, если остаток ³ 0

DEC  R1

;

Восстановление частного

ADD   A, #16Н   

;

Восстановление остатка

DА  А

RET

;****************************************************************

; ------------------------------ С16_10------------------------------------------------------

; Подпрограмма преобразования двоичного целого беззнакового числа

; формата 16 в двоично-десятичное число формата 5´4.

; Входные параметры: (R1,R0) – СТБ,МЛБ двоичного числа.

; Выходные параметры: (А,R3,R2) – двоично-десятичное число

; (0Р1Р2Р3Р4Р5).

;****************************************************************

С16_10:

CLR   A    

;

Обнуление текущей суммы

MOV   R2, A

MOV   R3, A

MOV   R4, A

MOV   R5, #16

;

Счетчик циклов

; Сдвиг двоичного числа влево

SHIFT:

MOV   A, R0

ADD   A, R0

MOV   R0, A

MOV   A, R1

ADDC   A, R1

MOV   R1, A

; Двоично-десятичное удвоение

MOV   A, R2

ADDC   A, R2

DA   A

MOV   R2, A

MOV   A, R3

ADDC   A, R3

DA   A

MOV   R3, A

MOV   A, R4

ADDC   A, R4

DA   A

MOV    R4, A

; Проверка конца цикла

DJNZ   R5, SHIFT

RET

; ***************************************************************

; ------------------------------ C10_16A ---------------------------------------------------

; Подпрограмма преобразования целого беззнакового двоично-десятичного

; числа формата 4*4 в двоичное число формата 16.

; Входные параметры: (R3,R2) – двоично-десятичное число (P3P2P1P0).

; Выходные параметры: (R7,R6) – СТБ,МЛБ двоичного числа.

; ***************************************************************

C10_16A:

CLR   A

;

Обнуление аккумулятора

MOV   R6, A

MOV   R7, A

MOV   R5, #0FH

MOV   A, R3

CALL   PPL1

;

Q1=(P4´10+P3)´10

MOV   A, R3

ANL   A, R5

CALL   PPL

;

Q2=(Q1+P2)´10

MOV   A, R2

CALL   PPL1

;

Q3=(Q2+P1)´10

; Вычисление Q4=Q3+P0

MOV   A, R2

ANL   A, R5

ADD   A, R6

MOV   R6, A

MOV   A, R7

ADDC   A, #0

MOV   R7, A

RET

PPL1:

ANL   A, #0F0H

SWAP   A

PPL:

ADD   A, R6

MOV   R6, A

MOV   A, R7

ADDC   A, #0

MOV   R7, A

CLR   C

CALL   P10A

;

Умножение на 2

MOV   R0, A

MOV   A, R7

MOV   R1, A

CALL   P10A

CALL   P10A

ADD   A, R0

MOV   R6, A

MOV   A, R7

ADDC   A, R1

MOV   R7, A

RET

P10A:

MOV   A, R6

RLC   A

XCH   A, R7

RLC   A

XCH   A, R7

MOV   R6, A

RET

; ***************************************************************

; --------------------------- С16_10F ------------------------------------------------------

; Подпрограмма преобразования дробного двоичного беззнакового числа

; с ФЗ формата 16 в двоично-десятичное число формата 4´4.

; Входные параметры: (R7,R6) – СТБ,МЛБ двоичного числа.  

; Выходные параметры: (R2,R3) – двоично-десятичное число ( ,Р1Р2Р3Р4).

; Используется подпрограмма M16_10F.

; ***************************************************************

VREM:

EQU   20H

;

Адрес ПД для временного хранения

С16_10F:

CLR   F0

CALL   М16_10F

PUSH   ACC       

;

Сохранение цифры Р1 (С.ц. Р1)

CALL   М16_10F

PUSH   ACC       

;

С.ц. Р2

CALL   М16_10F

PUSH   ACC       

;

С.ц. Р3

CALL   М16_10F

PUSH   ACC       

;

С.ц. Р4

CALL   М16_10F

MOV   R7, A       

;

(R7)=P5

; Упаковка цифр результата в регистры

POP   ACC        

;

Восстановление цифры Р4 (В.ц. Р4)

SWAP   A

ORL   A, R7

MOV   R7, A       

;

(R7)=P4P5

POP   ACC        

;

В.ц.  Р3

MOV   R6, A

POP   ACC        

;

В.ц.  Р2

SWAP   A

ORL   A, R6

MOV   R6, A       

;

(R6)=P2P3

POP   ACC        

;

(A)=P1

MOV   R5, A       

;

Сохранение А

MOV   A, R7

ANL   A, #0FH

ADD   A, #0FAH

MOV   A, R5

SWAP  A         

MOV   DPL, R0     

MOV   R0, #VREM    

MOV   @R0, A

MOV   A, R6

SWAP   A

XCHD   A, @R0

MOV   A, @R0

MOV   R2, A

MOV   A, R6

MOV   @R0, A

MOV   A, R7

SWAP   A

XCHD   A, @R0

SWAP   A

MOV   R3, A

MOV   A, R7

SWAP   A

MOV  A, @R0

MOV   A, R3

XCHD   A, @R0

MOV   R3, A

JNC   CON

CLR   A

ADDC   A, R3

DA   A

MOV   R3, A

CLR   A

ADDC   A, R2

DA   A

MOV   R2, A

CON:   

MOV   R0, DPL

RET

; ***************************************************************

; -------------------------- M16_10F -------------------------------------------------------

; Подпрограмма умножения дробного двоичного беззнакового числа

Похожие материалы

Информация о работе