Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MPSU_laboratornye.doc
Скачиваний:
73
Добавлен:
11.05.2015
Размер:
1.26 Mб
Скачать

Задание на лабораторную работу

Задача 1.1.Написать программу сложения (вычитания) двух 8-разрядных двоичных чисел, одно из которых содержится в регистре R, а второе – в ячейке памяти данных с адресом 02**16. Результат поместить в память данных по адресу 0x03**. Программы проверить на примерах: 1) 88**; 2) 00**; 3) FF**.

Задача 1.2.Написать программу сложения (вычитания) двух 16-разрядных двоичных чисел, одно из которых содержится в регистрах R1, R2, а второе – в ячейках памяти данных с адресами 02**16, 02**16 + 1. Результат поместить в ячейки памяти данных с адресами 03**16, 03**16 + 1. Программы проверить на примерах: 1) 8888**АВ; 2) 0000АВ**; 3) FFFFА**В.

Задача 1.3.Написать программу умножения 16-разрядного операнда на 8-разрядный операнд. Адрес операнда – ячейки памяти данных, начиная с адреса 02**16, адрес результата – ячейки памяти данных с адресами, начиная с адреса 03**16. Программы проверить на примерах: 1) 8888 ∙ **; 2) 0000 ∙ **; 3) FFFF ∙ **; 4) А**В ∙ **.

Задача 1.4.Написать программу деления операнда на постоянный коэффициент К. Адрес операнда – память данных 02**16, значение коэффициента К= ** + 5. При делении сохранить остаток.

Задача 1.5.Написать программу сложения (вычитания) двухразрядных двоично-десятичных чисел, одно из которых содержится в регистре R, а второе – в ячейке памяти данных с адресом 02**16. Программы проверить на примерах: 1) 4910**10; 2) 0010**10; 3) 9910**10.

Примечание:  

Имена регистров R, R1, R2 и число ** назначаются преподавателем.

Указание:  

Операцию деления свести к последовательности сложений и вычитаний. Исследовать возможности сокращения длины и времени выполнения программы. Программы проверить на тестовых примерах.

Примерырешения задач

Задача 1.1.Составим программы сложения (вычитания) двух 8-разрядных двоичных чисел, одно из которых содержится в регистре R16, а второе – в ячейке памяти данных с адресом 020016. Для операции сложения программа состоит из следующих команд:

.include "m2560def.inc"

ldi r16, 0x25 ; в r16 помещается первый операнд

lds r18, 0x0200 ; в r18 помещается второй операнд

add r18, r16 ; сложение r18=r18+r16

sts 0x0300, r18 ; сохранение результата

Для операции вычитания программа имеет вид:

.include "m2560def.inc"

ldi r16, 0x25 ; в r16 помещается заданный операнд

lds r18, 0x0200 ; в r18 помещается второй операнд

sub r18, r16 ; вычитание r18=r18-r16

sts 0x0300, r18

Результаты выполнения тестовых примеров представим в виде таблицы:

1-й операнд

2-й операнд

Сложение

Вычитание

Сумма

C

N

V

S

Z

Разность

C

N

V

S

Z

88

25

AD

0

1

0

1

0

63

0

0

1

1

0

00

25

25

0

0

0

0

0

DB

1

1

0

1

0

FF

25

24

1

0

0

0

0

DA

0

1

0

1

0

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

Задача 1.2.Составим программы сложения (вычитания) 16-разрядных двоичных чисел, одно из которых содержится в регистрах R20, R21, а второе – в ячейках памяти данных с адресами 020016, 020116. Операция сложения таких чисел выполняется в два этапа – сначала складываются младшие байты, а затем старшие (с учётом переноса). Соответствующая программа имеет вид:

.include "m2560def.inc"

ldi r21, 0x88

ldi r20, 0x88

lds r19, 0x0200

lds r18, 0x0201

add r19, r21

adc r18, r20

end:rjmpend; остановка программы

Аналогично выполняется и операция вычитания – сначала обрабатываются младшие байты, а затем – старшие (с учётом заёма):

.include "m2560def.inc"

ldi r21, 0x88

ldi r20, 0x88

lds r19, 0x0200

lds r18, 0x0201

sub r19, r21

sbcr18,r20

end:rjmpend; остановка программы

Результаты выполнения тестовых примеров представим в виде таблицы:

1-й операнд

2-й операнд

Сложение

Вычитание

Сумма

C

N

V

S

Z

Разность

C

N

V

S

Z

8888

25AB

AE33

0

1

0

1

0

62DD

0

0

1

1

0

0000

AB25

AB25

0

1

0

1

0

54DB

1

0

0

0

0

FFFF

A25B

A25A

1

1

0

1

0

5DA4

0

0

0

0

0

Анализ полученных результатов показывает, что сумма и разность вычисляются правильно, однако флаги Z и Nформируются лишь для старшего байта, а не для всего 16-разрядного числа.

Задача 1.3.Составим программу умножения двух восьмиразрядных двоичных чисел, хранящихся в памяти данных с адресами 020016и 020116. 16-разрядное произведение будем формировать в регистровой паре R1-R0. Результат сохраним по адресам 020016(младший байт) и 020116(старший байт).

.include "m2560def.inc"

lds r19, 0x0200

lds r18, 0x0201

mul r18, r19

sts 0x0300, r0

sts 0x0301, r1

end:rjmpend; остановка программы

Проверка программы на тестовых примерах приводит к результату

02 ∙ 25 = 004A; 10 ∙ 25 = 0250; 25 ∙ 25 = 0559,

который подтверждает её корректность.

Задача 1.4.Написать программу деления восьмиразрядных двоичных чисел для следующего распределения регистров:R17 – делимое в начале, остаток в конце, R16 – делитель;R18 – частное.

Алгоритм деления заключается в следующем. Из делимого вычитается делитель, пока делимое не станет меньше делителя. Количество таких вычитаний и будет частным. Для этого используется команда условного ветвления brlo метка, которая анализирует состояние флага переносаCи в зависимости от этого загружает в счётчик команд PC либо адрес метки, либо адрес следующей команды.

Остаток будет в регистре, который вначале хранил делимое. Программа, реализующая описанный алгоритм, имеет вид:

.include"m2560def.inc"

main: cp r17, r16 ; сравнить r16 и r17

brloend; перейти, если С=1

sub r17, r16 ; r16 = r17–r16

incr18; формируем частное

cpr17,r16

brshmain; перейти, если С=0

end:rjmpend; остановка программы

Проверка программы на примерах даёт:

10 : 02=08(00); 40 : 0F=04(04); FF : 0A=19(05).

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

.include "m2560def.inc"

init:

ldi r17,0x08

ldi r18,0x40

ldi r19,0x0F

ldi r25,0x01

m0:

mov r16, r18

rol r16

mov r18, r16

mov r16, r21

rol r16

sub r16, r19

brcc m1

add r16, r19

m1:

mov r21, r16

in r26,SREG

andi r26, 0x01

eor r26,r25

out SREG,r26

mov r16, r20

rol r16

mov r20, r16

dec r17

brne m0

end: rjmp end

Задача 1.2.Составим программы сложения (вычитания) двухразрядных десятичных чисел, хранящихся в регистреR19 и ячейке памяти данных с адресом 020016. Результат поместим в ячейку памяти данных 030016.

Программа двоично-десятичного сложения отличается от ранее рассмотренной программыдвоичного сложения десятичной коррекцией результата.

.include "m2560def.inc"

.def temp =r18

.def six = r19

.def sixteen = r20

summa:

ldi r16, 0b00010010

mov r15, r16

ldi r17, 0b00110011

sts 0x210, r17

lds temp, 0x210

ldi r28, 0b01100110

ldi six, 0b00000110

ldi sixteen, 0b01100000

neg six

neg sixteen

add r15, r28

add r15, temp

brhc correcth

brcc correctc

adc r2,r3

end:rjmp end

correcth:

adc r2, r3

add r15, six

cpse r2,r3

rjmp end

clc

rjmp correctc

correctc:

adc r2,r3

add r15, sixteen

rjmp end

Операция двоично-десятичного вычитания реализуется путём суммирования с дополнительным кодом, который находится по формуле (9910ПрКод) + 1:

Результат выполнения тестовых примеров представим в виде таблицы:

1-й операнд

2-й операнд

Сложение

Вычитание

Сумма

C

N

V

S

Z

Разность

C

N

V

S

Z

40

25

65

15

00

25

25

75

99

25

24

74

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]