Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Консп лек по ЭиУА.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
934.4 Кб
Скачать

7 Выполнение умножения и деления

Цель лекции: создание подпрограмм для целочисленного умножения и деления.

Краткое содержание лекции. Умножение и деление при помощи сдвига. Инструкции условных переходов. Роль регистра Status. Целочисленное деление. Умножение на дробное число.

7.1 Умножение и деление при помощи сдвига

Умножение числа на N-ю степень двойки реализуется сдвигом исходного зна­чении на N позиций влево. Таким образом, последовательность операций (00110 (6) << 01100 (12) << 11000 (24)), эквивалентна умножению числа 6 на 4. Оператор «<<» используется для обозначения сдвига влево. Это же правило примени­мо и к отрицательным числам

Аналогичным образом деление числа на N-ю степень двойки реализуется сдвигом значения на N позиций вправо, т.е. 1100 (12)>> 0110 (6) >> 0011 (3). Этот же способ применим также к знаковым числам.

Обратите внимание, что освободившиеся при сдвиге вправо освобождающие позиции заполня­ются не нулями, а содержимым знакового бита. Таким образом, при сдвиге поло­жительных чисел слева вдвигаются нули, а при сдвиге отрицательных чисел — единицы.

В общем случае применяются специальные алгоритмы для умножения и деления, использующие инструкции условных переходов при ветвлении.

7.2 Инструкции условных переходов

Инструкции условных переходов BTFSC и BTFSS проверяют состояние заданного бита в любом регистре и в зависимости от результата, пропускают или не пропускают следующую инструкцию программы см. таблицу 7.1. Инструкция BTFSC пропускает следующую инструкцию, если заданный бит сброшен. В реальных программах вместо указанных в таблице инструкций пишутся инструкции, соответствующих разработанному алгоритму.

Т а б л и ц а 7.1 - Использование битов CARRY (C) и ZERO (Z)

Использование бита CARRY (C)

BTFSS STATUS, C

GOTO METKA

MOVWF R2

Если в бите Carry установлена единица, то пропускается следующая инструкция программы GOTO МЕТКА и сразу выполняется инструкция MOVWF R2

Если бит Carry сброшен, то выполняется следующая инструкция программы GOTO METKA

Использование бита ZERO (Z)

BTFSS STATUS, Z

CALL SDVIG

MOVWF PORTC

Если в бите Zero установлена единица, то пропускается следующая инструкция программы CALL SDVIG и сразу выполняется инструкция MOVWF PORTC

Если бит Zero сброшен, то выполняется следующая инструкция программы CALL SDVIG и затем MOVWF PORTC

7.3 Целочисленное умножение

Умножение можно выполнить последовательным сложением, а деление – вычитанием, но при этом в некоторых алгоритмах необходимо как-то сравнивать два числа: одно из них множитель, второе количество выполненных сложений умножаемого числа. В ассемблере отсутствуют инструкции сравнения чисел. Чтобы определить, какое из чисел больше (меньше), применяют такой алгоритм:

1) Выполняют вычитание чисел. При этом в зависимости от результата, устанавливаются флаги C и Z регистра Status, см. таблицу 7.2.

2) Далее применяют инструкции условных переходов из таблицы 7.1.

Т а б л и ц а 7.2 – Регистрация событий в регистре Status

Соотношения значений в W и РОН UMENSH

Значения флагов регистра Status после выполнения вычитания

Флаг Z

Флаг C

UMENSH-W>0

0 -Нулевого результата не было

1 - был перенос из 7 бита W в бит С (при сложении в дополнительном коде)

UMENSH-W<0

0 - Нулевого результата не было

0 - не было переноса из 7 разряда W в бит С (при сложении в дополнительном коде)

UMENSH-W=0

1 - был нулевой результат операции

1- был перенос из 7 разряда W в бит С (при сложении в дополнительном коде)

П р и м е ч а н и е – В регистр UMENSH помещается уменьшаемое число

Напишем подпрограмму выполнения умножения последовательным сложением. Например, чтобы умножить 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