Imię ..........Piotr
Nazwisko ........Lewicki
Wiek ..
Wzrost 72.4409449 inch
Waga ...2574.9728 oz
Narodowość .........Polska

28-05-2010

Assembler – MIPS – Mnożenie macierzy

Filed under: Security — Tagi: , , — Levik @ 17:02

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:

[...]MIPS (Microprocessor without Interlocked Piped Stages) jest to architektura komputerowa (w szczególności procesor typu RISC) rozwijana przez firmę MIPS Technologies. Istnieje zarówno w wersji 32- jak i 64-bitowej.[...]

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

Pozdrawiam Levik

- by levik@wp.pl L3VIK -

Jesteś gościem numer - Twój adres IP to: 38.107.179.214