Files
2025-03-26 09:10:55 +01:00

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