Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВМСС_лабораторные.doc
Скачиваний:
80
Добавлен:
07.06.2015
Размер:
4.19 Mб
Скачать
    1. 3.3 Инструкция вычитания

          1. Синтаксис:

{label:}

SUB

Wb,

Ws,

Wnd

Wd=Wb-Ws

    1. 3.4 Инструкция деления

{label:}

DIV

Wm,

Wn

W0:W1=Wm/Wn-Wmделится наWn, результат записывается в регистровую паруW0:W1. Причем вW0 помещается целая часть, а вW1 – остаток от деления.

Пример программы, реализующий арифметическую функцию: e= (a+b) *c/d

.include "p33FJ256GP710.inc"

.equ a, 0x800

.equ b, 0x802

.equ c, 0x804

.equ d, 0x806

.equ e, 0x808

.text

.global __reset

__reset:

; - Инициализация переменных

mov #-3, W0

mov W0, a

mov #21, W0

mov W0, b

mov #10000, W0

mov W0, c

mov #-37, W0

mov W0, d

; - Реализация арифметической функции

mov a, W0

mov b, W1

add W0, W1, W2

mov c, W3

mul.ss W2, W3, W0

mov d, W2

repeat #17

div.sd W0, W2

mov W0, e

nop

.end

          1. Программа работы и последовательность выполнения

  1. Создайте новый проект. Процессор – dsPIC33FJ256GP710.

  2. Подключите необходимые библиотеки и перепишите программу, приведенную выше. Разберитесь в ее работе.

  3. Необходимо подключить отладчик (симулятор), встроенный в среду MPLABIDE. Выберете в меню <Debugger\SelectTool\MPLABSIM>.

  4. Скорректируйте код программы, выполняющий заданную арифметическую функцию. Переменные a,b,c,d– знаковые 16-ти разрядные числа.

№ Варианта

Арифметическая функция

1

e = ( a + 1 ) * ( b – 100 ) / (c + 1000)* (d – 1000)

2

e = ( a + b ) * ( c – b ) / (c + d)

3

e = ( a - b ) * ( c / d) + 12345

4

e = ( 100 - a ) / ( 100 - b ) * (c + d) – 4321

5

e = ( a + b - c ) * d / ( b – a ) + 9876

6

e = ( a * b + c ) * ( b – 100 ) / d

7

e = a * ( b - c ) / ( c – d ) + 12346

8

e = a* b + b / c – c * d – 13579

9

e = ( a * b + 100 ) / ( c + d – 100 )

10

e = ( a + 1000 ) * c + ( b – 1000 ) / d

11

e = ( a - d ) * ( b – c ) / d + 2468

12

e = a *d * ( b + 1000 ) / c – 1357

13

e = a / b + c / d – 1000 * a – 5432 * b

14

e = ( a + c - d ) * ( a - c + d ) / b

15

e = ( a + c * d ) * ( a – c* d ) / b

  1. Открыть окно Watchи внести в него все регистры, которые используются в коде. В пошаговом режиме отладить код, контролируя изменение регистров в окнеWatch. После отладки программы, показать код и результаты работы программы преподавателю.

  2. Создать блок схему программы.

  3. Дополнительное задание. Реализовать код программы с использование косвенной адресации.

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

  1. Назовите основные арифметические инструкции.

  2. Назовите способы адресации, используемые в командах вашей программы.

  3. Назовите количество тактов, за которые выполняются арифметические операции.

  1. Лабораторная работа №4. Циклы. Инструкции сравнения.

          1. Цель работы

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

          1. Содержание работы

    1. 4.1 Организация цикла

К основным командам организации циклов относятся DOиREPEAT. Рассмотрим основные отличия данных инструкций.

Пример 4.1:

mov #0, W0

mov #mas, W1

do #15, end

inc W0, W0

mov W0, [W1++]

end: nop

В данном примере используется инструкция DO. Первыми двумя командами мы инициализируем рабочие регистрыW0 обнуляется, а в регистрW1 заносим начальный адрес массиваmas. Следующая команда определяет начало циклаDO, количество итераций равное 16 (15+1). Цикл заканчивается меткойend. Между началом и концом цикла может находиться необходимое количество команд. Следующая команда инкрементирует регистрW0, а далее значениеW0 записывается в массивmas. Указатель массиваW1 инкрементируется в процессе выполнения операцииmov.

Пример 4.2:

mov #mas1, W1

mov #mas2, W2

repeat #15

mov [W1++], [W2++]

nop

В примере 4.2 используется инструкция REPEAT. Основное отличие данной инструкции отDOчто она выполняет в цикле только следующую за ней инструкцию необходимое количество раз.

Также компилятор поддерживает другое написание данных инструкций. В них вместо заданного числа (#15) можно использовать рабочий регистр. Но перед использованием данной конструкции команды необходимо предварительно задать значение этого рабочего регистра.