
- •Программирование цифровой техники и микроконтроллеров управления
- •Алматы 2012
- •1 Микроконтроллеры в современном мире
- •1.1 Краткая история развития микроконтроллеров
- •1.2 Задачи и роль микроконтроллеров
- •2 Выполнение арифметических операций в мп
- •2.1 Системы счислений
- •2.2 Двоичная арифметика
- •2.3 Дополнительный код
- •2.4 Знаковый разряд
- •3 Регистры общего и специального назначения
- •3.1 Регистры portc и trisc
- •3.2 Регистр Status
- •3.3 Фиксированная (абсолютная) адресация
- •4 Косвенная адресация. Логика
- •4.1 Косвенная адресация
- •4.2 Логические функции
- •5 Маскирование. Стек
- •5.1 Маскирование
- •5.2 Счетчик команд
- •5.3 Стек
- •6 Конвейер и подпрограмма задержки
- •6.1 Конвейер
- •6.2 Программа задержки
- •6.3 Расчет времени задержки
- •7 Выполнение умножения и деления
- •7.1 Умножение и деление при помощи сдвига
- •7.2 Инструкции условных переходов
- •7.3 Целочисленное умножение
- •7.4 Целочисленное деление
- •7.5 Умножение на дробное число
- •8 Программирование клавиатуры. Дешифратор
- •8.1 Клавиатура
- •8.2 Фрагменты программы
- •8.3 Дешифратор
- •8.4 Компаратор
- •9 Основные элементы цифровой техники
- •9.1 Сумматор
- •9.2 Арифметико-логическое устройство
- •9.3 Бистабильные схемы
- •9.4 Триггеры и регистры
- •10 Структура микроконтроллера. Индикатор
- •10.1 Применение операций сдвига
- •10.2 Цифровой индикатор
- •10.2 Структурная схема мк
- •11 Прерывания и сторожевой таймер
- •11.1 Прерывания
- •11.2 Подсчет посетителей с помощью прерываний
- •11.3 Сторожевой таймер
- •12 Фактор времени и аналоговый мир
- •12.1 Модуль таймера tmr1
- •12.2 Применение таймера tmr1
- •12.3 Аналоговый мир
- •Приложение а Список некоторых сокращений
- •Список литературы
- •Содержание
- •050013, Алматы, Байтурсынова, 126
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