|
Главная -> Появление первого микропроцессора 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [28] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 в основу программы положен алгоритм, описанный в работе [49]. Программа выполняет деление, если делимое не меньше делителя и делитель не равен нулю. Если деление возможно, программа устраняет незначащие нули делимого и делителя путем сдвига этих чисел влево с одновременной фиксацией разности их сдвигов. Например, если делимое и делитель имеют по 8 значащих цифр, ТО после сдвига делимого влево на 8 разрядов счетчик циклов деления в регистре (В) имеет значение 8 + 0 - - 8 = О, и деление практически выполнять не надо (достаточно вычесть делитель из делимого). Если же делимое имеет 16, а делитель - одну значащие цифры, то после нормализации чисел счетчик циклов в регистре (В) имеет значение 8 + 7 -0=15, и в этом случае потребуется 15 циклов деления для получения результата. После окончания деления остаток отделяется от частного и приводится к своему истинному значению путем сдвига вправо на величину начального сдвига делителя влево. Расширение диапазона обрабатываемых чисел в программе Д1616 требует дополнительных затрат памяти и времени по сравнению с программами Д16 и Д16А. Тестовые данные для программы приведены в табл. 1.17. Табл. 1.17. Тесты деления формата 16:8=(16, 16) (целые беззнаковые двоичные числа) Представление чисел шестнадцатеричное десятичное FFFF:FF=(0101, 00) 65535:255=(257,0) FFFF:F0=(0111, OF) 65535:240=(273, 15) FFFF:0F=(1111, 00) 65535:15=(4369, 0) 5555:АА=(0080, 55) 21845:170=(128. 85) АААА:55=(0202. 00) 43690:85=(514, 0) 1.5.2.3. Формат 24:16=18,16) Программа Д24 реализует деление с предварительным преобразованием делителя в дополнительный код и восстановлением остатка путем сохранения и извлечения его из стека (аналогичная программа приведена в работе [21]): 0А60 0050 ORG 0A60H ДОПВ SET 50H
JПОДПРОГРАММА ДЕЛЕНИЯ ЦЕЛЫХ ДВОИЧНЫХ ЧИСЕЛ ВЕЗ ЗНАКА ;ФОРМАТА 24:16=(8»16). ;МЕТОД ДЕЛЕНИЯ С ВОССТАНОВЛЕНИЕМ ОСТАТКА. 5ВХ0ДНЫЕ ПАРАМЕТРЫ!(НгЕтЕ)-ДЕЛИМОЕ,(В.С)-ДЕЛИТЕЛЬ. !ВЫХОДНЫЕ ПАРАМЕТРЫ!(Е)-ЧАСТНОЕ.(H»L)-0CTAT0K.CY=O-!-ПРИЗНАК ПЕРЕПОЛНЕНИЯ ЧАСТНОГО.ИСПОЛЬЗУЮТСЯ ВСЕ !РЕГИСТРЫ.КРОМЕ В.ГЛУБИНА СТЕКА-2.ИСПОЛЬЗУЕТСЯ ;ПОДПРОГРАММА »ДОПВ». ;0ЦЕНКА:ДЛИНА-48 БАЙТ.ВРЕМЯ-НЕ БОЛЕЕ 994 ТАКТА. sПРОВЕРКА ЧАСТНОГО НА ПЕРЕПОЛНЕНИЕ!ЧАСТНОЕ > 8 БИТ? в программе использован прием баланса стека с помощью команд изменения непосредственно указателя стека INX SP вместо обычно применяемых команд извлечения из стека типа POP. Такой прием полезен в случаях, когда все регистры заняты, но необходимо реализовать баланс стека. Тестовые данные, программы приведены в табл. 1.18. Табл. 1.18. Тесты деления формата 16:8=(16, 16) (целые беззнаковые двоичные числа) Представление чисел шестнадцатеричное десятичное FFFFOI:FFFF=(FF. 0000) 0E0FFF:F000 =(0Е. EFFF) 38АА73:5555 =(АА, 0001) FE01FF:FF00=(FF, 00FF) FE00FF:FF00=(FE, FEFF) 1671I425:65535=(255, 0) 921599;61440=(14, 61439) 3713651:21845=( 170, 1) 16646655:65280=(255, 255) 16646399:65280=(254. 65279) 1.5.2.4. Формат 32:16= (16,16) Программа Д32, подобно программе Д16, реализует деление по классической схеме с вычитанием делителя, восстановлением остатка путем его сложения с делителем и размещением частного на месте младших байтов делимого (аналогичная программа приведена в работе [71]: 0А90 ORG 0А90И Д32: »««««»»»»««»к»«к»« ;ПОДПРОГРАММА ДЕЛЕНИЯ ЦЕЛЫХ ДВОИЧНЫХ ЧИСЕЛ БЕЗ ЗНАКА ;ФОРМАТА 32:16=(16,16). гМЕТОД ДЕЛЕНИЯ С ВОССТАНОВЛЕНИЕМ ОСТАТКА. ;ВХОДНЫЕ ПАРАМЕТРЫ: (Н,L,В,Е)-ДЕЛИМОЕ, (В,С)-ДЕЛИТЕЛЬ. гВНХОДНЫЕ ПАРАМЕТРЫ:(В,Е)-ЧАСТНОЕ,(H,L)-OCTATOK,CY=0-!-ПРИЗНАК ПЕРЕПОЛНЕНИЯ ЧАСТНОГО.ИСПОЛЬЗУЮТСЯ ВСЕ РЕ-?ГИСТРЫ,СОХРАНЯЕТСЯ (В,С).ГЛУБИНА СТЕКА-2. ;0ЦЕНКА!ДЛИНА-41 БАЙТ,ВРЕМЯ-НЕ ЕОЛЕЕ 2316 ТАКТОВ. snPOBEPKA ЧАСТНОГО НА ПЕРЕПОЛНЕНИЕ:ЧАСТ НОЕ ) 16 ЕИТ?
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [28] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 0.0628 |
|