КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Лекция 7. Выполнения умножения и деления
Цель лекции: создать подпрограммы для целочисленного умножения и деления. 7.1 Умножение и деление при помощи сдвига. Умножение числа на N-ю степень двойки реализуется сдвигом исходного значении на N позиций влево. Таким образом, последовательность операций (00110 (6) << 01100 (12) << 11000 (24)), эквивалентна умножению числа 6 на 4. Оператор «<<» используется для обозначения сдвига влево. Это же правило применимо и к отрицательным числам Аналогичным образом деление числа на N-ю степень двойки реализуется сдвигом значения на N позиций вправо, т.е. 1100 (12)>> 0110 (6) >> 0011 (3). Этот же способ применим также к знаковым числам. Обратите внимание, что освободившиеся при сдвиге влево позиции заполняются не нулями, а содержимым знакового бита. Таким образом, при сдвиге положительных чисел слева вдвигаются нули, а при сдвиге отрицательных чисел — единицы. Данная операция известна как арифметический сдвиг вправо, в отличие от логического сдвига вправо, при котором всегда вдвигаются нули. В общем случае применяются специальные алгоритмы для умножения и деления, использующие инструкции условных переходов. В алгоритмах умножения и деления применяются инструкции условных переходов для ветвления. Инструкции условных переходов BTFSC и BTFSS проверяют состояние заданного бита в любом регистре и в зависимости от результата, пропускают или не пропускают следующую инструкцию программы. Инструкция BTFSC пропускает следующую инструкцию, если заданный бит сброшен. В реальных программах вместо указанных инструкций пишутся инструкции, соответствующих разработанному алгоритму. 7.2 Инструкции условных переходов. Т а б л и ц а 7.1 - Использование битов CARRY (C) и ZERO (Z).
7.3 Целочисленное умножение. Умножение можно выполнить последовательным сложением, а деление – вычитанием, но при этом необходимо как-то сравнивать два числа. В ассемблере отсутствуют инструкции сравнения чисел. Чтобы определить, какое из чисел больше (меньше), применяют такой алгоритм: 1. Выполняют вычитание чисел. При этом в зависимости от результата, устанавливаются флаги C и Z регистра Status, см. таблицу 7.2. 2. Далее применяют инструкции условных переходов. Т а б л и ц а 7.2 – Регистрация событий в регистре Status
Напишем подпрограмму выполнения умножения последовательным сложением. Например, чтобы умножить 25 на 10 нужно выполнить десять раз сложение: 25*10=25+25+25+25+25+25+25+25+25+25=250. Umnozhenie; подпрограмма. Входы Umn_Chislo и Mnozh, выход Pr. Clrf Pr Clrf Kol_slag Sled_slag Movf Pr, W; загружаем Pr в W.
Addwf Umn_Chislo, W; добавление очередного слагаемого. Movwf Pr Incf Kol_slag, F; отмечаем количество сложений. MOVF Kol_slag, W XORWF Mnozh, F; маскированием проверяем Kol_slag=Mnozh. Btfss STATUS, Z; проверяем Z=1? Goto Sled_slag; выполняется только при Z=0. RETURN 7.4 Целочисленное деление Алгоритм целочисленного деления показан в таблице 7.3. Из алгоритма видно, что, если делитель равен нулю, то программа зациклится. Таблица 7.3 - Алгоритм целочисленного деления
Delenie; подпрограмма. Входы Delimoe и Delitel, выходы Chastnoe и Ostatok. CLRF Chastnoe Movf Delimoe, W; MOVWF Rab_peg; копируем Delimoe в рабочий регистр. MOVF Delitel, W; копируем Delitel в W. BTFSC STATUS, Z; защита от деления на нуль. GOTO NUL; выполняется только при Z=1. Metka INCF Chastnoe, F; накапливаем частное. SUBWF Rab_peg, F; вычитаем Rab_peg=Rab_peg-Delitel. BTFSC STATUS, C; проверяем разность отрицательная? GOTO Metka; выполняется только при C=1. ; Было выполнено одно лишнее вычитание. Возвращаемся на один шаг. DECF Chastnoe, F; восстанавливаем частное. ADDWF Rab_peg, W; восстанавливаем предыдущее значение Rab_peg. MOVWF Ostatok; запоминаем остаток. RETURN NUL MOVLW D'255'; защита от деления на ноль. MOVWF PORTC; сигнализируем о зацикливании программы. END 7.5 Умножение на дробное число. Умножение на дробное число можно выполнить с точностью до целых с помощью умножения заданного числа на целое число (множитель), и затем деления результата на другое целое число (делитель). Множитель и делитель подбираются на калькуляторе или MSExcel. Пример. Выполним умножение числа 6 на 0,8. Сначала на калькуляторе подберем целочисленный множитель и целочисленный делитель, таким образом, чтобы получить примерно заданный коэффициент. В данном случае подходят множитель 4 и делитель 5, поскольку 4/5=0,8. Далее умножаем заданное число на четыре, и затем результат делим на пять. Остаток будет определять погрешность проведенных вычислений.
Дата добавления: 2014-12-07; Просмотров: 801; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |