Assembler-Programm interpretieren
-
Hi,
.data arr: .word 3 2 -6 1 4 10 530 115 2231 1422 arrSize: .word 10 .text .globl main main: la $s0, arr la $t0, arrSize lw $s1, 0($t0) add $s2, $zero, $zero loop: lw $t1, 0($s0) andi $t2, $t1, 1 bne $t2, $zero, skip addi $s2, $s2, 1 skip: addi $s0, $s0, 4 addi $s1, $s1, -1 bne $s1, $zero, loop end: add $v0, $zero, $s2
so ich soll das interpretieren,...
Mein Problem liegt in der 9. Zeile: was macht 0($t0) ???
-
Was ist das für eine Architektur? MIPS? Sieht aus wie...
$s1 = *$t0
in Pseudo C-Code, wobei $t0 ein Zeiger auf ein 4 Byte
int
ist.
-
ja ist MIPS
und
lw $t1, 0($s0)
ist dann wohl dasselbe , nur müsste der zeiger auf das int- Array zeigen oder?
-
nur was wird dann in zeile 14 fürs $t1 verwendet ?
-
In zeile 13 lädt er ein word aus deinem Feld (Adresse ist in $s0 gespeichert) nach $t1.
Weiter: $t1 wird dann in Zeile 14 mit 1 AND verknüpft. Dadurch bleibt in $t1 nur das niederwertigste Bit übrig.
In Zeile 15 wird getestet ob $t1 ungleich 0 ist...usw.
-
also wenn das niedrigste Bit, also $t1 in zeile 15 ungleich 0 ist => heißt dass dann dass der erste eintrag in meinem array ungerade ist oder was sagt das aus?
und was mich noch irritiert zum schluss wird ja $s2 ausgegeben , aber das wird nur in zeile 16 verwendet und die wird ja nur einmal durchlaufen oder? weil wenns in zeile 15 nicht nach skip geht wars das doch mit dem loop oder muss ich nachdem loop korrekt durchlaufen wurde auch noch ins skip?
-
Das ist doch gerade der Witz!
s2** zählt die Anzahl der ungeraden Zahlen in Deinem Feld. Dazu wird **s2 am Anfang mitadd $s2, $zero, $zero
auf 0 gesetzt.
zu loop wird solange gesprungen wie s1 immer schön runter gezählt. Am Anfang wird $s1 mitlw $s1, 0($t0)
auf 10 gesetzt.
Bitte schau Dir die Bedeutung der Befehle nochmal in Ruhe an, sonst sehe ich echt schwarz.
-
Grundsätzlich kenn ich die Befehle ja nur diese pointer hab ich vorher noch nie gesehen...
und
addi $s0, $s0, 4
in $s0 ist doch mein array drin , wird jetzt zu jedem element vom array 4 addiert oder nur zum 1.?
-
addi $s0, $s0, 4
springt in der adresse ja einfach um 4 weiter oder?
bin ich dann schon beim nächsten eintrag im array?
-
Grundsätzlich kenn ich die Befehle ja nur diese pointer hab ich vorher noch nie gesehen...
Zeiger sind in der Assemblerprogrammierung nun mal das Pfeffer und das Salz. Ohne geht ja fast gar nichts. Deine Fragen zeigen mir das Du wirklich nur sehr sehr wenig durchblickst.
addi $s0, $s0, 4
Deine Einträge im Feld sind vermutlich 32 Bit groß?
Falls ja, dann ist das schon ok so. Der Zeiger wird um 4 Byte erhöht => Du landest beim nächsten Element im Feld.Es war ja eigentlich Deine Aufgabe das zu interpretieren. Dummerweise habe ich Dir jetzt so gut wie alles abgenommen. Asche über mein Haupt.