Програма обчислення факторіалу

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
УІ
Кафедра:
Не вказано

Інформація про роботу

Рік:
2013
Тип роботи:
Лабораторна робота
Предмет:
Архітектура комп’ютерів та комп’ютерних систем

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ, НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”  Лабораторна робота № 6 з дисципліни "Архітектура комп’ютерів ч.2" Львів – 2013 Тема: Програма обчислення факторіалу Мета : Дослідити техніку конвеєрного виконання програми обчислення факторіалу Хід роботи У даній лабораторній роботі досліджується програма, що виконує обчислення факторіалу числа n (n – вводиться користувачем з клавіатури) Факторіал натурального числа - добуток натуральних чисел від одиниці до n включно, позначається n!  Базисна версія програми, що буде симулюватися Файл Fact.s (власне обчислення) .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 trap 0 Файл INPUT.s (допоміжна програма для введення даних) .data ;*** Data for Read-Trap ReadBuffer: .space 80 ReadPar: .word 0,ReadBuffer,80 ;*** Data for Printf-Trap PrintfPar: .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 PrintfPar,r1 addi r14,r0,PrintfPar 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 Loop: ;*** reads digits to end of line lbu r3,0(r2) seqi r5,r3,10 ;LF -> Exit bnez r5,Finish subi r3,r3,48 ;ґ0ґ multu r1,r1,r4 ;Shift decimal add r1,r1,r3 addi r2,r2,1 ;increment pointer j Loop Finish: ;*** restore old register contents lw r2,SaveR2 lw r3,SaveR3 lw r4,SaveR4 lw r5,SaveR5 jr r31 ; Return  Рис.1 Вікно конвеєра   Рис.3 Вікно введення/виведення Рис.2 Вікно статистики Як бачимо, було виконано 57 інструкцій, на що пішло 88 циклів (CPI=1.54). Відбулося 10 RAW пригальмовування конвеєра, 8 пригальмовувань керування і 12 пригальмовувань зупинки (trap stalls). Всього зупинок конвеєра 30 Модифікована (оптимізована) версія програми .data Prompt: .asciiz "An integer value >1 : " PrintfFormat:.asciiz "Factorial = %g\n\n" .align 2 PrintfPar: .word PrintfFormat PrintfValue: .space 8 ;*** Data for Read-Trap ReadBuffer: .space 80 ReadPar: .word 0,ReadBuffer,80 PrintfPar1: .space 4 .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 InputUnsigned: ;*** 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,Exit multu r1,r1,r4 ;Shift decimal nop subi r3,r3,48 nop addi r2,r2,1 ;increment pointer add r1,r1,r3 j Loop1 Exit: jr r31 ; Return Finish: ;*** write result to stdout sd PrintfValue,f2 addi r14,r0,PrintfPar trap 5 trap 0  Рис.3 Вікно конвеєра Рис.4 Вікно статистики Було виконано 55 інструкцій, на що пішло 79 циклів (CPI=1.43) Не відбулося жодного RAW пригальмовування, 8 пригальмовувань керування і 12 пригальмовувань зупинки (trap stalls). Всього зупинок конвеєра 20 Для оптимізації було введено декілька “порожніх” інструкції nop, змінено порядок виконання деяких інструкцій та інтегровано функцію для введення /виведення в основну програму Висновок: На лабораторній роботі я опанувала техніку конвеєрного виконання програми обчислення факторіалу
Антиботан аватар за замовчуванням

19.12.2013 22:12-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!