Программы умножения двоичных чисел
; *************************************************************** |
|||
; ---------------------------- 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 ------------------------------------------------------- |
|||
; Подпрограмма умножения дробного двоичного беззнакового числа |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.