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 mit

    add $s2, $zero, $zero
    

    auf 0 gesetzt.
    zu loop wird solange gesprungen wie s1ungleich0ist.Davorwirds1** ungleich 0 ist. Davor wird **s1 immer schön runter gezählt. Am Anfang wird $s1 mit

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


Anmelden zum Antworten