42 lines
2.3 KiB
NASM
42 lines
2.3 KiB
NASM
################################################################################################
|
|
# 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 ####
|
|
################################################################################################
|