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