################################################################################################ # Das Programm wandelt fuer ein Feld von Bytes jeweils das obere Nibble und anschliessend das # # untere Nibble in die entsprechende ASCII-Darstellung um und speichert diese auf dem Stack. # # Aufgabe zur Code-Analyse der Pruefungsklausur Computersysteme im WS14/15, # # urspruenglich in DLX-Assembler verfasst, uebersetzt von C. Hesseling im Jan 2017 # ################################################################################################ .data in: .byte 0x5d 0x18 0x2a 0x34 0x00 mask: .word 0xF .text la $t1, in # laedt die Adresse des byte-Arrays in $t1 lw $t2, mask # laedt die Maske mask in $t2 lb $t3, ($t1) # laedt ein Byte aus dem Byte-Array in $t3 addi $t1,$t1,1 # inkrementiert die Adresse, sodass bei erneutem Zugriff das naechste Byte geladen wird beqz $t3, m2 # Beendet das Programm, wenn das geladene Byte = 0 ist m1: srl $t4, $t3, 0x4 # Schiebt den Inhalt von $t3 um 4 nach rechts und speichert das Ergebnis in $t4 jal m3 # Sprung zu m3 (Pc+4 wird in Register 31 = $ra gespeichert) and $t4, $t3, $t2 # bitweise UND-Verknuepfung von $t3 und der Maske in $t2, Ergebnis in $t4 jal m3 # Sprung zu m3 (PC+4 wird in Register 31 = $ra gespeichert) lb $t3, ($t1) # Naechstes Byte aus dem Array laden addi $t1, $t1, 1 # Adresse inkrementieren bnez $t3, m1 # Sprung zu m1, falls das geladene Byte ungleich 0 ist m2: li $v0, 10 # exit syscall m3: addi $t5,$t4,0x30 # 0x30 wird addiert, hier sind die ASCII-Zeichen ab '0' hinterlegt slti $t6,$t4,0xA # falls das aktuelle Nibble > 10 ist, wird 0x7 addiert, um auf die Zeichen bnez $t6,m4 # 'A' bis 'F' zu verweisen, sonst weiter mit Marke m4 addi $t5,$t5,0x7 m4: addi $sp, $sp, -4 # Praedekrement des Stackpointers sb $t5, ($sp) # Sichern von $t5 auf dem Stack jr $ra # Ruecksprung ################################################################################################ ##### In der ASCII-Tabelle stehen die Zeichen fuer '0' bis '9' an der Stelle 48 bis 57, ### ##### die Zeichen 'A' bis 'F' stehen an der Stelle 65 bis 70 #### ################################################################################################