Вы находитесь на странице: 1из 11

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное

учреждение высшего образования

«Рязанский государственный радиотехнический университет имени В.Ф.


Уткина»

Кафедра ЭВМ

Отчет

о лабораторной работе по ЭВМиПУ №2

«Особенности выполнения арифметических и логических операций в


RISC процессорах»

Выполнили:

студенты гр. 046 – бр. 7

Артамонов К.В.

Мартынова Е.С.

Молодкин С.О.

Проверил:

с.п. Устюков Д. И.

Рязань, 2021
Задание 2.1:
Изучить примеры использования логических операций, приведенные в
программе LR_2. Для ввода программы создайте новый файл в
существующем проекте.
LR_2
.include "m16def.inc";1
ldi r16, 0x04 ;2
out sph, r16 ;3
ldi r16, 0x5f ;4
out spl, r16 ;5
m: call pp1 ;6
; call pp2 ;7
; call pp3 ;8
jmp m ;9
pp1: ldi r16, 0x0f ;10
ldi r17 , 0x45 ;11
ldi r18 , 0x67 ;12
ldi r19 , 0x89 ;13
ldi r20 , 0xr18 ;14
and r17, r16 ;15
andi r17,0b00000010;16
or r18, r16 ;17
tst r16 ;18
eor r19, r16 ;19
eor r19, r19 ;20
mov r17, r20 ;21
and r17, r16 ;22
swap r16 ;23
and r18, r16 ;24
or r17, r18 ;25
bst r16, 7 ;26
bld r20, 2 ;27
sei ;28
cli ;29
ret ;30
pp2: ;31
ret ;32
pp3: ;33
ret ;34

2
Трасса:

Команда Действие Результат


ldi r16, 0x0f R16=0x0F R16=0x0F
ldi r17, 0x45 R17=0x45 R17=0x45
ldi r18, 0x67 R18=0x67 R18=0x67
ldi r19, 0x89 R19=0x89 R19=0x89
ldi r20, 0x18 R20=0x18 R20=0x18
and r17, r16 R17 and R16 R17=0x05
andi r17, 0b00000010 R17 and 0b00000010 R17=0x00
or r18, r16 R18 or R16 R18=0x6F
tst r16 Признаки Z и N Z = 0, N = 0
eor r19, r16 R19 eor R16 R19=0x86
eor r19, r19 R19 eor R19 R19=0x00
mov r17, r20 R17=R20 R17=0x18
and r17, r16 R17 and R16 R17=0x08
swap r16 перестановка тетрад в байте R16 R16=0xF0
and r18, r16 R18 and R16 R18=0x60
or r17, r18 R17 or R18 R17=0x68
bst r16, 7 запись значения 7 в R16 T=0
bld r20, 2 загрузка бита во 2 разряд R20 R20=0x1C
sei разрешить прерывания
cli запретить прерывания

В программе реализовано использование логических операций, которые


потом записываются в ячейки памяти с адресами 0x0060-0x0063.

3
Задание 2.2.
В программу 2.1 добавьте подпрограмму формирования признака z=1, если
введенное в регистр r5 произвольное двоичное число соответствует
заданной маске. Приведите результаты тестирования программы при
пересылке в r5 различных чисел.

Код подпрограммы:
pp2: ;17
ldi r16, 0b10110000 ;18
mov r5, r16 ;19
inc r16 ;20
ldi r17, 0x0f ;21
ldi r18, 0x91 ;22
and r5, r17 ;23
mov r5, r16 ;24
and r5, r17 ;25 проверка при помощи and
mov r5, r18 ;26
and r5, r17 ;27
mov r5, r16 ;28
mov r4, r16 ;29
eor r4, r5 ;30 проверка eor

Проверка работы подпрограммы:


При r5=0b10110000, r17=0x0f: При r5=0b10010001, r17=0x0f
and r5,17 and r5,18
Z=1; Z=0
При r5=r4=0b10110001: При r5=0b10110001, r17=0x0f:
eor r4,r5 and r5,17
Z=1 Z=0

4
Трасса
Команда Действие Результат
ldi r16, 0b10110101 R16=0b10110000 R16=0b10110000
mov r5, r16 R5:=r16 R5=0b10110000
inc r16 R16=0b10110000+1 R16=0b10110001
ldi R17, 0x0f R17:=0x0f R17=0x0f
ldi R18, 0x91 R18:=0x91 R18=0x91
and r5,r17 R5 “И” R17 R5=0; Z=1
mov r5,r16 R5:=r16 R5=0b10110001
and r5,r17 R5 “И” R17 R5=0b00000001; Z=0
mov r5,r18 R5:=r18 R5=0b10010001
and r5,r17 R5 “И” R17 R5=0b00000001; Z=0
mov r5,r16 R5:=r16 R5=0b10110001
mov r4,r16 R4:=r16 R4=0b10110001
eor r4,r5 R5 “Сумма по модулю 2” R4 R4=0; Z=1

Задание 2.3.
Составьте подпрограмму, позволяющую исследовать выполнение
операций сдвигов.
pp3: ;31 задание 2.3 операции сдвигов
ldi r16, 0b10110100 ;32
mov r5, r16 ;33
mov r4, r16 ;34
lsr r5 ;35 логический сдвиг вправо /2
lsr r5 ;36
lsl r5 ;37 логический сдвиг влево *2
asr r5 ;38 арифметический сдвиг вправо /2, знак числа
сохраняется
asr r5 ;39
swap r4 ;40 перестановка тетрад

ret ;41

5
Трасса:
Команда Действие Результат
ldi r16, 0b1011010 R16:=0b1011010 R16=0b10110100
mov r5, r16 R5:=r16 R5=0b10110100
mov r4, r16 R4:=r16 R4=0b10110100
lsr r5 Логический сдвиг вправо R5=0b01011010
lsr r5 Логический сдвиг вправо R5=0b00101101
lsl r5 Логический сдвиг влево R5=0b01011010
asr r5 Арифметический сдвиг R5=0b00101101
вправо
asr r5 Арифметический сдвиг R5=0b00010110
вправо
swap r4 Перестановка тетрад R4=0b01001011(0xb4 –
0x4b)

Задание 2.4.
Заданы 4 чиcла A, B, C, D, записанные в десятичной системе счисления.
Исследуйте работу программы, вычисляющей суммы: A + B, B + C, C + D

pp4:
ldi r16, 17 ;43
ldi r17, 107 ;44
ldi r18, 178 ;45
ldi r19, 237 ;46
add r16, r17 ;47
add r17, r18 ;48
add r18, r19 ;49

ret ;50

6
Трасса
Команда Действие Результат
ldi r16, 17 R16=17 R16=17
ldi r17, 107 R17=107 R17=107
ldi r18, 178 R18=178 R18=178
ldi r19, 237 R19=237 R19=237
add r16, r17 R16:= R16+R17 R16=0x7C
add r17, r18 R17:= R17+R18 R17=0x1D
add r18, r19 R18:= R18+R19 R18=0x9F

В прямом коде:
1. 17+107=124=0x7C
2. 107+178=285=0x11D (В программе 1 отбрасывается, т.к. сумма
превышает максимальное значение)
3. 178+237=415=0x19F (В программе 1 отбрасывается, т.к. сумма
превышает максимальное значение)
В дополнительном коде:
1. 17=0b00010001
2. 107=0b01101011
3. 178=0b10110010 (178-256=-78) – отрицательное число
4. 237=0b11101101 (237-256=-19) – отрицательное число
5.
Задание 2.5
Вычисление среднего значения двух чисел

Код:
pp5:
ldi r16, 17 ;51
ldi r17, 107 ;52
mov r0, r16 ;53
add r0, r17 ;54
ror r0 ;55

ret ;56

7
Трасса:
Команда Действие Результат
ldi r16, 17 R16=17 R16=0x11
ldi r17, 107 R17=107 R17=0x6B
mov r0, r16 R0=R16 R18=0x11
add r0, r17 R0=R0+R17 R0=0x7C
Ror r0 Сдвиг вправо R1=0x3E
17+107=124(0x7C);
124/2=62(0x3E);

Задание 2.6.
Вычисление среднего значения нескольких чисел

Код:
pp6:
ldi r16, 17 ;57
ldi r17, 107 ;58
ldi r18, 178 ;59
ldi r19, 237 ;60
mov r0, r16 ;61
add r0, r17 ;62
adc r1, r2 ;63
add r0, r18 ;64
adc r1, r2 ;65
add r0, r19 ;66
adc r1, r2 ;67
ror r1 ;68
ror r0 ;69
ror r1 ;70
ror r0 ;71
ret; ;72

8
Трасса:
Команда Действие Результат
ldi r16, 17 R16=17 R16=0x11
ldi r17, 107 R17=107 R17=0x6B
ldi r18 , 178 R18=178 R18=0xB2
ldi r19 , 237 R19=237 R19=0xED
mov r0, r16 R0=R16 R0=0x11
add r0, r17 R0=R0+R17 R0=0x7С
adc r1, r2 R1:=R1+R2+C R1=0x00
add r0, r18 R0=R0+R18 R0=0x2E
adc r1, r2 R1:=R1+R2+C R1=0x01
add r0, r19 R0=R0+R19 R0=0x1B
adc r1, r2 R1:=R1+R2+C R1=0x02
ror r1 Сдвиг вправо R1=0x01
ror r0 Сдвиг вправо R0=0x0D
ror r1 Сдвиг вправо R1=0x80
ror r0 Сдвиг вправо R0=0x86
(17+107+178+237)/4=134,75=0x86

Задание 2.7.
Умножение положительных чисел

Код:
pp7:
ldi r16, 17 ;73
ldi r17, 107 ;74
ldi r18, 178 ;75
ldi r19, 237 ;76
mul r16, r17 ;77
mul r17, r18 ;78
mul r18, r19 ;79

ret ;80

9
Трасса:

Команда Действие Результат


ldi r16, 17 R16=17 R16=0x11
ldi r17, 107 R17=107 R17=0x6B
ldi r18 , 178 R18=178 R18=0xB2
ldi r19 , 237 R19=237 R19=0xED
mul r16, r17 R16*R17 R1=0x07
R0=0x1B
mul r17, r18 R17*R18 R1=0x4A
R0=0x66
mul r18, r19 R1=0xA4
R18*R19 R0=0xCA

Проверка:
1) 17*107=1819(0x071B)
2) 107*178=19046*(0x4A66)
3) 237*178=42185(0xA4XA)

Задание 2.8.
Умножение чисел со знаком

Код:

pp8:
ldi r16, 17 ;81
ldi r17, 107 ;82
ldi r18, 178 ;83
ldi r19, 237 ;84
muls r16, r17 ;85
muls r17, r18 ;86
muls r18, r19 ;87

ret ;88

10
Трасса:
Команда Действие Результат
ldi r16,17 R16:=17 R16=0x11
ldi r17,107 R17:=107 R17=0x68
ldi r18,178 R18:=178 R18=0xB2
ldi r19,237 R19:=237 R19=0xED
muls r16,r17 R16*R17(запись в R0,R1) R1=0x07
R0=0x1B
muls r17,r18 R17*R18 R1=0xDF
R0=0x66
muls r18,r19 R18*R19 R1=0x05
R0=0xCA

Вообще должно быть:


178=0b10110010(отрицательное число, значит 178-256=-78)
237=0b11101101(отрицательное число, значит 237-256=-19)
17*107=1819(0x07f1)
107*(-78)=8346(0x209a)
-78*(-19)=1482(0x5ca)

Вывод:
По окончании лабораторной работы мы освоили особенности выполнения
арифметических и логических операций в RISC процессорах и приобрели
навыки работы с логическими операциями в микроконтроллерах AVR.

11