Тестирование
Входные данные |
Выходные данные |
Пояснение |
x1, y1, z1 = 10, 15, 5 x2, y2, z2 = 8, 20, 7 |
r1 = 648 r2 = 904 |
Все верно |
x1, y1, z1 = 1, 2, 3 x2, y2, z2 = 4, 5, 6 |
r1 = 384 r2 = 772 |
Все верно |
x1, y1, z1 = 0, 0, 0 x2, y2, z2 = 1, 1, 1 |
r1 = 0 r2 = 128 |
Все верно |
x1, y1, z1 = -1, -9, -7 x2, y2, z2 = 5, -11, 0 |
r1 = -8389485 r2 = 8388603 |
Все верно |
x1, y1, z1 = 6586, 268, 824 x2, y2, z2 = 1234, 987, 672 |
r1 = 112040 r2 = 87233 |
Все верно |
ВЫВОД
В результате выполнения лабораторной работы была освоена работа с эмулятором Ripes, произведена его установка и настройка, а также была изучена архитектура RISC-V, базовый набор инструкций, и разработана программа с использованием подпрограмм на ассемблере.
ПРИЛОЖЕНИЕ
Код программы lb5.s:
.data
x1: .word 10
y1: .word 15
z1: .word 5
x2: .word 8
y2: .word 20
z2: .word 7
a: .word 20
b: .word 7
c: .word 9
sep: .asciz ", "
f: .asciz "\nf = ((x & (-a)) ^ (y >> c)) + (z << b)"
xyz1: .asciz "x1, y1, z1 = "
xyz2: .asciz "\n\nx2, y2, z2 = "
answer: .asciz "\nr = "
.text
.globl main
main:
lw a2, x1
lw a3, y1
lw a4, z1
lw a5, x2
lw a6, y2
lw a7, z2
lw s0, a
lw s1, b
lw s2, c
mv t0, a2 # t0 = x1
mv t1, a3 # t1 = y1
mv t2, a4 # t2 = z1
call func # вызов функции
mv a1, a0 # перенос результата в a1 (a1 = r1)
li a7, 4 # функция печати строки
la a0, xyz1 # перенос начала строки в a0
ecall # вывод x1, y1, z1 =
li a7, 1 # функция печати числа
mv a0, a2 # перенос числа в a0
ecall # вывод x1
li a7, 4 # функция печати строки
la a0, sep # перенос начала строки в a0
ecall # вывод ,
li a7, 1 # функция печати числа
mv a0, a3 # перенос числа в a0
ecall # вывод y1
li a7, 4 # функция печати строки
la a0, sep # перенос начала строки в a0
ecall # вывод ,
li a7, 1 # функция печати числа
mv a0, a4 # перенос числа в a0
ecall # вывод z1
li a7, 4 # функция печати строки
la a0, f # перенос начала строки в a0
ecall # вывод f = ((x & (-a)) ^ (y >> c)) + (z << b)
li a7, 4 # функция печати строки
la a0, answer # перенос начала строки в a0
ecall # вывод r =
li a7, 1 # функция печати числа
mv a0, a1 # перенос числа в a0
ecall # вывод результата (r1)
mv t0, a5 # t0 = x2
mv t1, a6 # t1 = y2
lw t2, z2 # t2 = z2
jal func # вызов функции
mv a2, a0 # перенос результата в a2 (a2 = r2)
li a7, 4 # функция печати строки
la a0, xyz2 # перенос начала строки в a0
ecall # вывод x2, y2, z2 =
li a7, 1 # функция печати числа
mv a0, a5 # перенос числа в a0
ecall # вывод x2
li a7, 4 # функция печати строки
la a0, sep # перенос начала строки в a0
ecall # вывод ,
li a7, 1 # функция печати числа
mv a0, a6 # перенос числа в a0
ecall # вывод y2
li a7, 4 # функция печати строки
la a0, sep # перенос начала строки в a0
ecall # вывод ,
li a7, 1 # функция печати числа
lw a0, z2 # перенос числа в a0
ecall # вывод z2
li a7, 4 # функция печати строки
la a0, f # перенос начала строки в a0
ecall # вывод f = ((x & (-a)) ^ (y >> c)) + (z << b)
li a7, 4 # функция печати строки
la a0, answer # перенос начала строки в a0
ecall # вывод r =
li a7, 1 # функция печати числа
mv a0, a2 # перенос числа в a0
ecall # вывод результата (r2)
li a7, 2500 # a7 = 2500
li s3, 2490 # s3 = 2490
sub a7, a7, s3 # функция выхода из программы a7 = 2500 - 2490 =10
ecall # выход из программы
func:
mv t3, s0 # t3 = a
neg t3, t3 # t3 = (-a)
and t3, t0, t3 # t3 = x & (-a)
srl t4, t1, s2 # t4 = y >> c
xor t5, t3, t4 # t5 = (x & (-a)) ^ (y >> c)
sll t6, t2, s1 # t6 = z << b
add a0, t5, t6 # a0 = ((x & (-a)) ^ (y >> c)) + (z << b)
ret
