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

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

Задача 2.1.Написать программу, которая позволяет установить, сбросить, инвертироватьiиjбиты заданного операнда, находящегося в регистре R. Результат представить в виде таблицы. Программы проверить для операндов: FF16,F016, 0F16, 0016.

Примечание: Номера регистров R, R1, R2 и число ** назначаются преподавателем. Номера разрядов i, j, k, l участвующих в операциях, вычисляются как остаток от деления на 8 числа **. Остаток от деления ## = i, ## + 2 = j, ##+4, ##+6 соответственно.

Задача 2.2.Написать программу, обеспечивающую проверкуi-го бита заданного операнда, хранящегося в регистре R. Если он равен 0, поместить в ячейку памяти данных 0x0200, 16-ричный эквивалент своего номера варианта в подгруппе. Если “1”, то поместить шестнадцатеричный эквивалент своего номера варианта в подгруппе с инвертированными чётными битами. Программу проверить для следующих операндов: FF16,F016, 0F16, 0016.

Задача 2.3.Написать программу, обеспечивающую выполнение логической операции:

y=xi*xj+xk*NOT(xl),

где i,j,k,l– номера битов числа, содержащегося в регистре R. Результат поместить в память данных по адресу 0x02**. Программу проверить для операндов: 1F16, 2B16, 0C16, A116.

Задача 2.4. Написать программу, обеспечивающую вычисление суммы единиц в массиве чисел, расположенного в памяти программ. Результат поместить в регистры Ri,Rj. Количество элементов в массиве – 1010. Программу протестировать на случайных числах.

Задача 2.5.Написать программы умножения (деления) операнда на 4 с учётом знака числа. Адрес операнда и результата в памяти данных 0x02** и 0x03** соответственно. При делении остаток не сохранять. Программу проверить для операндов F016и 0F16.

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

Задача 2.1.Написать программу, которая позволяет установить, сбросить, инвертировать 1 и 3 биты операндов FF16, F016, 0F16, 0016.

Маски для установки, сброса и инвертирования соответственно будут: 0b00001010; 0b11110101; 0b00001010.

.include"m2560def.inc"

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

mov r17, r16

mov r18, r16

ldi r19, 0b00001010

main: or r16, r19 ; логическое ИЛИ операнда и маски

eor r18, r19 ; Исключающее ИЛИ операнда и маски

com r19 ; инверсия маски

and r17, r19 ; логическое И операнда и маски

Операнд

Результат

Bi,j=1

Bi,j=0

Bi,j=NOT(Bi,j)

FF

FF

F5

F5

F0

FA

F0

FA

0F

0F

05

05

00

0A

00

0A

Задача 2.2.Написать программу, обеспечивающую проверкуi-го бита заданного операнда, хранящегося в регистре R16. Если он равен 0, записать в ячейку памяти данных 0x0200, 16-ричный эквивалент своего номера варианта в подгруппе. Если “1”, то записать шестнадцатеричный эквивалент своего номера варианта в подгруппе с инвертированными чётными битами. Программу проверим для операнда FF16.

.include"m2560def.inc"

init:ldir16, 0xFF

ldir17, 0b00001000 ; маска для 3 бита

ldir18, 0x05 ; пусть задан 5 вариант

ldir19, 0b00001000 ; для проверки на 1 третьего бита

main: and r16, r17

cp r16, r19

brne equal

ldi r20, 0b01010101

equal: eor r18, r20

sts0x0200,r18

Задача 2.3.Написать программу, обеспечивающую выполнение логической операцииy=x1*x2+x4*NOT(x6) битов числа, содержащегося в регистре R16. Программу проверить для операнда:BB16.

.include"m2560def.inc"

main: ;x1*x2+x4*not(x6)

breqmain; программа зацикливается при установленном флагеZ

ldir16, 0b10111011 ;0xBB

andir16, 0b00000110 ;проверка 1 и 2 бита

breqpart2 ;переход если флагZ=1

ldi r16, 0b10111011

andi r16, 0b00000100 ;проверка 2 бита

brnemain; переход если флагZ=0

part2:

ldi r16, 0b10111011

andi r16, 0b00010000 ;проверка 4 бита

breq main

ldi r16, 0b10111011

ldi r17, 0b01000000

eor r16, r17 ; инверсия 6 бита

andi r16, 0b01000000 ; проверка 6 бита

rjmp main

Результат работы программы отображает флаг Z. Если при возврате в начало подпрограммыmainфлагZ=1, то функцияyбудет равна 0. Если флагZсброшен –y=1.

Задача 2.4.Составим программу подсчёта числа единиц в слове, расположенном в памяти программ. Результат из регистраR0 сохраним в памяти данных 020016.

Организуем циклический алгоритм, на каждом шаге которого операнд сдвигается влево с добавлением нуля в младший бит. Затем анализируется флаг переноса C, и если он установлен в единицу, увеличиваем содержимое регистраR1. Операнд из массива чисел предварительно определим черезarray: .db.

Программа подсчёта числа единиц имеет вид:

.include "m2560def.inc"

.def temp_reg=r0

.def rezult=r1

.cseg

array: .db 0x0F

init: ldi zl, LOW(array)

ldi zh, HIGH(array)

clr rezult ; rezult = 0

lpmtemp_reg,z+ ; взять из памяти программ число

main:lsltemp_reg; сдвиг влево, добавляя справа 0

brccm1 ; еслиC= 0 переход наm1

increzult; иначеrezult=rezult+ 1

m1:brnemain; конец ?

end:sts0x0200,rezult; сохранить результат в ОЗУ

Проверка программы для операндов FF, 77, 21 приводит соответственно к результату 8, 6, 2.

Задача 2.5.Составим программы, реализующие операции арифметического сдвига влево и вправо над содержимым аккумулятора.

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

Особенность арифметического сдвига состоит в том, что содержимое старшего (знакового) разряда сохраняется неизменным. Такой сдвиг можно реализовать при помощи следующих операций: циклического сдвига влево минуя флаг переноса, и двукратного циклического сдвига вправо через флаг переноса. После второго сдвига в аккумуляторе восстанавливается исходное число, а во флаге переноса помещается его знак. Третий сдвиг формирует число, соответствующее арифметическому сдвигу вправо.

Программа арифметического сдвига вправо имеет вид:

8200 07 RLC; сдвиг влево

8201 1FRAR; сдвиг вправо через С

8202 1FRAR; сдвиг вправо через С.

8203 E7RST4

При арифметическом сдвиге влево все биты смещаются на один разряд влево, а в освободившийся младший разряд записывается 0. В рассматриваемом микропроцессоре такую операцию можно реализовать путём сброса флага переноса и циклического сдвига влево через этот флаг:

8200 07 RLC; флагC=0

8201 1FRAR; сдвиг вправо черезC.

8202 E7RST4

При проверке следующих программ следует учитывать, что арифметический сдвиг вправо осуществляет деление операнда на 2, а арифметический сдвиг влево – умножение на 2. Например, для операнда 24 сдвиг вправо даёт 12, а сдвиг влево - 48.

Написать программы, обеспечивающие умножение (деление) операнда на 4. Адреса операндов 0x0200, 0x0201; адреса результатов – 0x0300, 0x0301. Программу проверить для операндов F016 и 0F16.

.include "m2560def.inc"

/*lds r16, 0x0200

lds r17, 0x0201*/

ldi r16, 0xFF

lslr16 ;умножениеR16 на 2 с сохранением знака

adcr19,r20

lslr19

lslr16 ;умножениеR16 на 2 с сохранением знака

adcr19,r20

/*asrr17 ;делениеR17 на 2 с сохранением знака

asrr17 ;делениеR17 на 2 с сохранением знака

sts0x0300,r16

sts0x0301,r17*/

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