Лабораторная работа №4. Умножение на дробное Число 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лабораторная работа №4. Умножение на дробное Число



 

Цель работы: изучить алгоритмы выполнения умножения и деления. Научиться сравнивать числа, изучить инструкции условных переходов BTFSC и BTFSS и применение их для ветвления.

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

Т а б л и ц а 4.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 MOVF R2, W MOVWF PORTC Если в бите Z установлена единица, то пропускается следующая инструкция программы MOVF R2 и сразу выполняется инструкция MOVWF PORTC
Если битZ сброшен, то выполняется следующая инструкция программы MOVF R2, Wи затемMOVWF PORTC

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

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

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

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

Т а б л и ц а 4.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+25+25+25+25+25+25+25+25+25=250.

Алгоритм целочисленного деления показан в таблице 4.3. Из алгоритма видно, что, если делитель равен нулю, то программа зациклится.

Таблица 4.3 - Алгоритм целочисленного деления

Цикл Частное Рабочий регистр Действие Рабочий регистр Значение бита «С» С=0? Действие
      Rab_peg= Rab_peg- Delitel     Нет Повторяем цикл
          Нет Повторяем цикл
          Нет Повторяем цикл
      -5   Да Возвращаемся назад на 1 шаг
    -5         Остаток=5
Результат деления: частное=3, остаток =5, т.е. 35/10=3 (5)

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

Пример. Выполним умножение числа 6 на 0,8. Сначала на калькуляторе подберем целочисленный множитель и целочисленный делитель, таким образом, чтобы получить примерно заданный коэффициент. В данном случае подходят множитель 4 и делитель 5, поскольку 4/5=0,8. Далее умножаем заданное число на четыре, и затем результат делим на пять. Остаток будет определять погрешность проведенных вычислений. Оформим умножение и деление в виде подпрограмм, которые будем применять в дальнейшем.

Фрагменты программы. Примененные РОН показаны на рисунке 4.2.

Стандартная настройка МК опущена. Исполняемая часть программы.

CLRF PORTC; записать в PORTC нули (потушить светодиоды).

CLRF Delitel; очищаем делитель.

; умножаем 6*0,8=6*4/5=4(4)

MOVLW D'6'

MOVWF Chislo; заданное число

MOVWF Umn_Chislo; умножаемое число равно заданному числу.

MOVLW D'4'

MOVWF Mnozh; множитель.

MOVLW D'5'

CALL Umnozhenie

; подготовка к делению.

Movf Pr, W; значение Pr получено в подпрограмме Umnozhenie.

Movwf Delimoe

Movlw D'5'

movwf Delitel; если не дать значение будет деление на ноль.

CALL Delenie

Goto$

Umnozhenie; подпрограмма. Входы Umn_Chislo и Mnozh, выход Pr.

Clrf Pr

Clrf Kol_slag

Sled_slag

Movf 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

Goto Sled_slag

RETURN

Delenie; подпрограмма. Входы Delimoe и Delitel, выходы Chastnoe и Ostatok.

CLRF Chastnoe

Movf Delimoe, W;

MOVWF Rab_peg; записали Delimoe в рабочий регистр.

MOVF 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

Блок-схема программы представлена на рисунке 4.1.

Выполните умножение по таблице 4.5, результаты - в таблицу 4.4.

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

 
 

Рисунок 4.2 – Окно наблюдения Создайте окно наблюдения для всех регистров в необходимом формате чисел и внесите в отчет по лабораторной работе. Чтобы быстро получить данные в окне наблюдения запустите составленную программу в режиме F9. После её выполнения нужно нажать F5.    

Таблица 4.4 Вариант 11. Результаты умножения на 0,8.

Коэффициент Число Множитель Делитель Результат Остаток Точность
0,8           83,3%

Таблица 4.5– Варианты заданий умножения числа на дробный коэффициент

Вариант Коэффициент Число Вариант Коэффициент Число
  1,33     6,33  
  2,33     7,33  
  3,33     8,33  
  4,33     9,33  
  5,33     10,33  

Контрольные вопросы.

1 Поясните команду условного перехода BTFSC STATUS, C.

2 Поясните команду условного перехода DECFSZ R3, F.

3 Расскажите об алгоритме умножения на целое число.

4 Какой логической операцией можно определить равенство чисел?

5 Расскажите об алгоритме деления на целое число.

6 Расскажите об алгоритме умножения на дробное число.

7 Как контролируется отрицательный результат вычитания?

8 Как контролируется нулевой результат вычитания?

9 Какой результат будет при умножении 26 на 10 в регистре МК?

10 Умножить 4 на 0,8 можно двумя способами: 4*4/5 или 4/5*4. Будут ли результаты одинаковы?

11 Поясните инструкцию условного перехода BTFSS STATUS, Z.

12 Как можно определить равенство чисел?

13 Когда флаги Z и C регистра Status одновременно равны нулю?

14 Как определить более мощную установку из двух потребителей?

15 Как выполняется сравнение чисел?



Поделиться:


Последнее изменение этой страницы: 2017-01-28; просмотров: 163; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.59.231 (0.011 с.)