Assembler – MIPS – Mnożenie macierzy
Hej, oto kod prezentujący mnożenie macierzy, na studiach w ramach kursu Architektura systemów komputerowych kodzimy w asemblerze. Na warsztacie mamy mikroporcesor MIPS:
Procek ten jest 2 na liście najczęściej wykorzystywanych procesorów, a to za sprawą jego komercyjnego sukcesu, chociaż nie tylko. Można go spotkać np. w PSP, albo PS2. =)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | ################################################### # # Krótkie omówienie: # Program mnoży macierze. Poniżej mały przykład, aby zobrazowac ideę zapisu macierzy jako # tablicy w asm. (wiersz po wierszu). Należy również podać wymiary macierzy. # ################################################### # ASCII ART <^_^> # # A. B. C. # | 1 0 2| |3 1| |5 1| # |-1 3 1| |2 1| = |4 2| # |1 0| # .data macierzA: .byte 1,0,2,-1,3,1 macierzB: .byte 3,1,2,1,1,0 newLine: .asciiz "\n" spacja : .asciiz " " wynik : .asciiz "macierz C:\n" .text main: ############# WYMIARY MACIERZY ########### li $s0,2 # wiersze macierzy A li $s1,3 # kolumny macierzy A li $s2,3 # wiersze macierzy B li $s3,2 # kolumny macierzy B ########################################## bne $s1,$s2,koniec # aby pomnożyć macierze liczba kolumn macierzy A. musi być równa liczbie wierszy macierzy B. move $s4,$s0 # wiersze macierzy C move $s5,$s3 # kolumny macierzy C la $t8,macierzA la $t9,macierzB li $v0,4 la $a0,wynik syscall li $t0,0 # inicjalizacja liczniaka petli for1: li $t1,0 # inicjalizacja liczniaka petli for2: move $a0,$t8 move $a1,$t9 jal mnozenie # wywołanie procedury mnozenie jej kod zostal zaczerpniety z poprzedniego cwiczenia li $v0,1 move $a0,$t6 syscall li $v0,4 la $a0,spacja syscall add $t9,$t9,1 # dodajemy jeden aby przejsc na następną kolumne add $t1,$t1,1 bne $t1,$s3,for2 li $v0,4 la $a0,newLine syscall la $t9,macierzB # ponownie ustawiamy adres macierzy B add $t8,$t8,$s1 # dodajemy do adresu liczbę kolumn macierzy a aby przejsc do nastepnego wiersza add $t0,$t0,1 bne $t0,$s0,for1 koniec: li $v0,10 syscall mnozenie: li $t3,0 #licznik petli li $t6,0 #wynik for3: lb $t4,0($a0) lb $t5,0($a1) mul $t4,$t4,$t5 # mnożenie składowych add $t6,$t6,$t4 # sumowanie wyniku add $a0,$a0,1 # przesuwamy sie na nastepny element macierzy A add $a1,$a1,$s3 # przesuwamy sie na nastepny element macierzy B add $t3,$t3,1 bne $s1,$t3,for3 jr $ra |







