#autor: Antonín Neumann #osobní číslo: A11B0439P #program: Klouzavý průměr #zkratky: # DB - Delay Branches .data vstup: .asciiz "Vloz cislo: " mimotxt: .asciiz "Zadané číslo musi byt int16\n" prumertxt: .asciiz "Prumer " radek: .asciiz "\n" values: .asciiz "Hodnoty " carka: .asciiz ", " .text .globl main main: #start move $t0, $zero move $t1, $zero move $t2, $zero move $t3, $zero move $t4, $zero move $t5, $zero move $t6, $zero move $t7, $zero move $s0, $ra #uložení návratové hodnoty do OS move $s1, $zero #aktuální průměr li $s2, 8 #počet čísel li $s3, 33000 #ukončující číslo #načtení 1. čísla prvni: jal nacti #načte číslo nop jal prumer #vypočte průměr move $t0, $v0 #uloží číslo #kvůli zpožděnému skoku uvedeno až za "jal prumer" jal tisk #vytiskne hodnoty a jejich průměr move $s1, $v0 #uloží průmer #kvůli zpožděnému skoku uvedeno až za "jal tisk" #načtení 2. čísla druhe: jal nacti nop jal prumer move $t1, $v0 jal tisk move $s1, $v0 #uloží průmer #načtení 3. čísla treti: jal nacti nop jal prumer move $t2, $v0 jal tisk move $s1, $v0 #uloží průmer #načtení 4. čísla ctvrte: jal nacti nop jal prumer move $t3, $v0 jal tisk move $s1, $v0 #uloží průmer #načtení 5. čísla pate: jal nacti nop jal prumer move $t4, $v0 jal tisk move $s1, $v0 #uloží průmer #načtení 6. čísla seste: jal nacti nop jal prumer move $t5, $v0 jal tisk move $s1, $v0 #uloží průmer #načtení 7. čísla sedme: jal nacti nop jal prumer move $t6, $v0 jal tisk move $s1, $v0 #uloží průmer #načtení 8. čísla osme: jal nacti #načte číslo nop jal prumer #vypočte průměr move $t7, $v0 #uloží načtené číslo jal tisk #tisk move $s1, $v0 #uloží průmer jal prvni #znovu začnu načítat čísla od prvního nop prumer: add $v0, $t0, $t1 #$v0 <- $t0 + $t1 add $v0, $v0, $t2 #$v0 <- $v0 + $t2 add $v0, $v0, $t3 #$v0 <- $v0 + $t3 add $v0, $v0, $t4 #$v0 <- $v0 + $t4 add $v0, $v0, $t5 #$v0 <- $v0 + $t5 add $v0, $v0, $t6 #$v0 <- $v0 + $t6 add $v0, $v0, $t7 #$v0 <- $v0 + $t7 div $v0, $s2 #$v0 <- $v0 / 8, výsledek je v registru $LO j $ra #návrat na místo odkud byt podprogram zavolán #DELAY BRANCHES mflo $v0 #přesun výsledku z $LO do $v0 #nop nacti: #vytistne řetězec li $v0,4 la $a0,vstup syscall #načte číslo li $v0,5 syscall nop #DB beq $v0, $s3, exit nop #DB bge $v0, 32767, mimo nop #DB ble $v0, -32768, mimo nop #DB j $ra nop #DB mimo: #vytiskne řetězec (není int16) li $v0, 4 la $a0, mimotxt syscall j nacti nop tisk: #tisk hodnot li $v0, 4 la $a0, values syscall li $v0, 1 move $a0, $t0 syscall li $v0, 4 la $a0, carka syscall li $v0, 1 move $a0, $t1 syscall li $v0, 4 la $a0, carka syscall li $v0, 1 move $a0, $t2 syscall li $v0, 4 la $a0, carka syscall li $v0, 1 move $a0, $t3 syscall li $v0, 4 la $a0, carka syscall li $v0, 1 move $a0, $t4 syscall li $v0, 4 la $a0, carka syscall li $v0, 1 move $a0, $t5 syscall li $v0, 4 la $a0, carka syscall li $v0, 1 move $a0, $t6 syscall li $v0, 4 la $a0, carka syscall li $v0, 1 move $a0, $t7 syscall li $v0, 4 la $a0, radek syscall #tisk prumeru li $v0, 4 la $a0, prumertxt syscall li $v0, 1 move $a0, $s1 syscall li $v0, 4 la $a0, radek syscall j $ra nop exit: move $ra, $s0 jr $ra nop