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
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.
|