Forum: PC Hard- und Software Frage zu MIPS Assembler Befehl


von Bert S. (kautschuck)


Lesenswert?

Hallo,
ich habe folgendes kleines Programm in MIPS Assembler geschrieben wo das 
Skalarprodukt zweier Verktoren ausrechnet. Ich möchte nun aber im Label 
'start' nicht "lw $t3, A($t1)" sondern den Wert aus dem 
Parameterregister $a0 laden, in welches ich die Anfangsadresse des 
Arrays A geladen habe.

Wenn es sich nicht um eine Schleife handeln würde, könnte man doch:
"lw $t3, zahl($a0)" , wie aber ersetze ich die Zahl durch ein Register, 
so dass "lw $t3, $t1($a0)" herauskommt?
1
 
2
.data #Von hier an bis -text wird alles als Daten gelesen
3
A: .word 1,2,3,4,5,6 #Arrays
4
B: .word 4,56,87,12,2,89
5
lenght: .word 6 #laenge
6
7
.text #Von hier an wird alles als Programm gelesen
8
main: #muss vorhanden sein, wird immer zuerst angesprungen
9
  la $a0, A #Adresse A laden
10
  la $a1, B #adresse B laden
11
  lw $a2, lenght($zero) #Laenge laden
12
  addi $t0, $zero, 28  #Wert wo in sp gespeichert werden soll
13
  jal skalar #Funktionsaufruf mit PC = PC+4 in $ra gespeichert
14
  j exit #Ende
15
skalar:
16
  addi $sp, $sp, -8 #Stackpointer verringern
17
  sw $fp, 4($sp) #fp speichern um später wieder den fp auf alten Wert zurueckzusetzen
18
  sw $t0, 0($sp) #t0 speichern
19
  addi $fp, $sp, 4 #framepointer auf sp+4 setzen
20
  li $t0, 0
21
  li $s0, 0
22
start:  
23
  li $t2, 0 #Zuruecksetzen von t Registern
24
  li $t3, 0
25
  li $t4, 0
26
  
27
  sll $t1, $t0, 2 #Da Adresse in 4* Schritten, immer t1 = 4*t0
28
  lw $t3, A($t1) #Laden von A[$t0], $t1, da immer 4*$t0
29
  lw $t4, B($t1) #Laden von B[$t0]
30
  mul  $t2, $t3, $t4
31
  add $s0, $s0, $t2
32
  
33
  addi $t0, $t0, 1
34
  sll $t1, $t1, 2
35
  beq $t0, $a2, end #Abfragen, ob $t0 == length
36
  j start #Schleife wiederhohlen bis $t0 == length
37
end:  
38
  addi $sp, $fp, -4 # SP zuruecksetzen
39
  lw $fp, 4($sp)
40
  lw $t0, 0($sp)
41
  addi $sp, $sp, 8
42
  add $v0, $zero, $s0
43
  jr $ra
44
  
45
exit:

Gruss Bert

von Bert S. (kautschuck)


Lesenswert?

Ok, habe es schon herausgefunden:
1
add $t5, $a0, $t1
2
add $t6, $a1, $t1
3
lw $t3, 0($t5) #Laden von A[$t0], $t1, da immer 4*$t0
4
lw $t4, 0($t6) #Laden von B[$t0]

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.