МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
ЗВІТ
про виконання лабораторної роботи № 6
«ПРОГРАМА ФАКТОРІАЛ»
з дисципліни
«Архітектура комп’ютерів ч.2»
Мета: опанування навичок з самостійного планування експерименту та розв'язування інженерних задач, що при цьому виникають, з подальшим оцінюванням ефективності запропонованих та втілених пропозицій.
Завдання: засобами архітектурного симулятора WinDLX дослідити на прикладі творених студентом фрагментів програмного коду можливості виконання обчислення факторіалу на рівні апаратури та позитивні ефекти, що при цьому досягаються. За результатами проведених лабораторних досліджень оформити звіт та захистити його.
Хід роботи
Завантажую базову програму.
/
Виправляю помилки базової програми.
/
Додаю до коду модуль InputUnsigned
.data
;*** Data for Read-Trap
ReadBuffer: .space 80
ReadPar: .word 0,ReadBuffer,80
;*** Data for Printf-Trap
PrintfPar1: .space 4
SaveR2: .space 4
SaveR3: .space 4
SaveR4: .space 4
SaveR5: .space 4
.text
.global InputUnsigned
InputUnsigned:
;*** save register contents
sw SaveR2,r2
sw SaveR3,r3
sw SaveR4,r4
sw SaveR5,r5
;*** Prompt
sw PrintfPar1,r1
addi r14,r0,PrintfPar1
trap 5
;*** call Trap-3 to read line
addi r14,r0,ReadPar
trap 3
;*** determine value
addi r2,r0,ReadBuffer
addi r1,r0,0
addi r4,r0,10 ;Decimal system
Loop1: ;*** reads digits to end of line
lbu r3,0(r2)
seqi r5,r3,10 ;LF -> Exit
bnez r5,Finish1
subi r3,r3,48 ;ґ0ґ
multu r1,r1,r4 ;Shift decimal
add r1,r1,r3
addi r2,r2,1 ;increment pointer
j Loop1
Finish1: ;*** restore old register contents
lw r2,SaveR2
lw r3,SaveR3
lw r4,SaveR4
lw r5,SaveR5
jr r31 ; Return
Виконую базову програму на симуляторі, наводжу результат виконання.
/
/
Модифікую базову програму.
; WINDLX Ex.3: Factorial
; (c) 1991 Guenther Raidl
; Modified: 1992 Maziar Khosravipour
; Program begin at symbol main
; requires module INPUT
; read a number from stdin and calculate the factorial (type: double)
; the result is written to stdout
;---
.data
Prompt: .asciiz "An integer value >1 : "
PrintfFormat: .asciiz "Factorial = %g\n\n"
.align 2
PrintfPar: .word PrintfFormat
PrintfValue:.space 8
.text
.global main
main:
;--- Read value from stdin into R1
addi r1,r0,Prompt
jal InputUnsigned
;--- init values
movi2fp f10,r1 ;R1 -> D0 D0..Count register
cvti2d f0,f10
addi r2,r0,1 ;1 -> D2 D2..result
movi2fp f11,r2
cvti2d f2,f11
movd f4,f2 ;1-> D4 D4..Constant 1
;--- Break loop if D0 = 1
Loop: led f0,f4 ;D0<=1 ?
bfpt Finish
;--- Multiplication and next loop
multd f2,f2,f0
subd f0,f0,f4
j Loop
Finish: ;--- write result to stdout
sd PrintfValue,f2
addi r14,r0,PrintfPar
trap 5
;--- end
trap 0
.data
;*** Data for Read-Trap
ReadBuffer: .space 80
ReadPar: .word 0,ReadBuffer,80
;*** Data for Printf-Trap
PrintfPar1: .space 4
SaveR2: .space 4
SaveR3: .space 4
SaveR4: .space 4
SaveR5: .space 4
.text
.global InputUnsigned
InputUnsigned:
;*** save register contents
sw SaveR2,r2
sw SaveR3,r3
sw SaveR4,r4
sw SaveR5,r5
;*** Prompt
sw PrintfPar1,r1
addi r14,r0,PrintfPar1
trap 5
;*** call Trap-3 to read line
addi r14,r0,ReadPar
trap 3
;*** determine value
addi r2,r0,ReadBuffer
addi r1,r0,0
addi r4,r0,10 ;Decimal system
Loop1: ;*** reads digits to end of line
lbu r3,0(r2)
nop
seqi r5,r3,10 ;LF -> Exit
nop
bnez r5,Finish1
subi r3,r3,48 ;ґ0ґ
multu r1,r1,r4 ;Shift decimal
nop
nop
nop
nop
add r1,r1,r3
addi r2,r2,1 ;increment pointer
j Loop1
Finish1: ;*** restore old register contents
lw r2,SaveR2
lw r3,SaveR3
lw r4,SaveR4
lw r5,SaveR5
jr r31 ; Return
Виконую модифіковану програму на симуляторі, наводжу результат виконання.
/
/
Висновок: на лабораторній роботі я дослідив базову програму, вирішив інженерну задачу з розв’язання проблем базової програми, яка містить операції з обчисленням факторіалу, здійснив модифікацію базової програми та досягнув вищої ефективності роботи RISC CPU .