Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ Прог ЦТ лабы для БАУ 2011.doc
Скачиваний:
17
Добавлен:
01.05.2015
Размер:
2.99 Mб
Скачать

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?

Действие

1

1

35

Rab_peg= Rab_peg- Delitel

25

1

Нет

Повторяем цикл

2

2

25

15

1

Нет

Повторяем цикл

3

3

15

5

1

Нет

Повторяем цикл

4

4

5

-5

0

Да

Возвращаемся назад на 1 шаг

3

-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

6

4

5

4

4

83,3%

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

Вариант

Коэффициент

Число

Вариант

Коэффициент

Число

1

1,33

62

6

6,33

12

2

2,33

35

7

7,33

11

3

3,33

22

8

8,33

10

4

4,33

17

9

9,33

9

5

5,33

14

10

10,33

8

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

  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. Как выполняется сравнение чисел?