![]() | |
НПО Системы Безопасности (499)340-94-73 График работы: ПН-ПТ: 10:00-19:00 СБ-ВС: выходной ![]() ![]() |
Главная » Периодика » Безопасность 0 ... 120121122123124125126 ... 159
ДЕЛЕНИЕ Представленная здесь программа деления сначала определяет, насколько далеко может быть сдвинут влево (в сторону старших разрядов) делитель, прежде чем сравнивать его с делимым. 16-разрядная переменная Count в этой программе используется для подсчета битов и добавления к частному, а переменная Temp - для временного хранения. После выполнения программы в регистрах делимого содержится остаток деления.
rlf rlf goto loop movf subwf movwf movf subwf btfss decf btfsc goto movwf movf movwf movf addwf movf addwf skip bcf rrf rrf rrf btfss goto divisor, f divisor + 1, f sta rtloop divisor +1, w dividend +1, w temp divisor, w dividend, w status, с temp, f temp, 7 skip dividend temp, w dividend + 1 count, w quotient + 1, f count, w quotient + 1, f, status, с divisor + 1, f divisor, f count + 1, f count, f status, с loop вычитание делителя из делимого если делитель меньше делимого вычитание не производится если значение temp отрицательное, то делитель меньше делимого сохранение делимого прибавление значения count к частному сдвиг делителя/count вправо если перенос установлен после сдвига переменной count, то операция завершается если перенос не установлен, обрабатывается следующий бит Представленная программа деления предназначена только для работы с положительными числами. Общего алгоритма для положительных и отрицательных чисел, возвращающего частное и остаток правильного знака, не существует. Общий вид программы деления для работы с положительными и отрицательными числами приведен ниже. If (dividend < 0) { dividend = о - dividend, dividendneg = 1, i else dividendneg = 0, if (divisor < 0) { если число отрицательное, то знак изменяется знак сохраняется повтор того же действия с делителем Divisor = О - Divisor, dividendneg = 1, I else divisordneg = 0, Count = 0, Quotient = 0, while ((Divisor & 0x0400) = 0) { Count = Count + 1 Divisor = Divisor << 1, I while (Count 1 = 0) { if (Dividend > = Divisor) { Quotient = Quotient + 2 " Count, Dividend = Dividend - Divisor, } Count = Count - 1 Divisor = Divisor >> 1 if (Dividendneg == 1) if (Divisorneg =- 1) { Quotient = Quotient, Remainder = 0 - Dividend, I else { Quotient = 0 - Quotient, Remainder = 0-- Dividend, else if (Divisorneg 1) { Quotient = 0 - Quotient, Remainder = Dividend, I else { Quotient = Quotient, Remainder = Dividend, I Начало деления Выравнивание делителя для начала деления Инкрементирование счетчика сдвигов Выполнение деления Можно выполнить вычитание Изменение значения Делимое было попожительнйм 0 ... 120121122123124125126 ... 159 |