Files
nand2tetris/MARS/Simulationen/Simulation 16 Klausuraufgabe Code-Analyse SS 14/Simulation 16.asm
2025-03-26 09:10:55 +01:00

89 lines
2.5 KiB
NASM

########################################################################################
# Wandelt eine vorzeichenbehaftete 32-Bit-Integer-Zahl in die 32-Bit-IEEE-754-Form #
# um, legt diese an der Speicherstelle dst ab und gibt sie aus. #
# Aufgabe zur Code-Analyse der Pruefungsklausur Computersysteme im SS14, urspruenglich #
# in DLX-Assembler verfasst, uebersetzt und modifiziert von C. Hesseling im Jan 2017 #
########################################################################################
.data
src: .word 0xFFFFFF85
dst: .word 0xDEADBEEF
mask1: .word 0x80000000
mask2: .word 0xFFFFFFFF
mask3: .word 0x7FFFFF
message1: .asciiz "\nDie 32-Bit-IEEE-754-Darstellung ist binaer: "
message2: .asciiz " und hexadezimal: "
.text
# Laden der zu wandelnden Zahl und der Masken in die Register
lw $t1, src
lw $t2, mask1
lw $t3, mask2
lw $t4, mask3
# Bitweise UND-Verknuepfung mit Maske 1, Vorzeichentest, wenn Zahl positiv ist, springe zu m1
and $t5, $t1 , $t2
beqz $t5, m1
# Die beiden folgenden Zeilen werden nur ausgefuehrt, wenn die Ursprungszahl negativ ist:
# Bitweise Negation durch die Verwendung von Maske 2, danach Addition von 1,
# berechnet also das Zweierkomplement
xor $t1, $t1, $t3
addi $t1, $t1, 0x1
# Maske 1 in $t2 wird so verschoben, dass sie nun das Bit 30 statt Bit 31 extrahiert,
# der Zaehler in $t6 wird mit 0 initialisiert
m1: srl $t2, $t2, 1
and $t6, $zero, $zero
# Schleife: Der Inhalt von $t1 wird solange nach links verschoben, bis ein
# 1-Bit an Position 30 erkannt wird, dann wird zu m3 gesprungen,
# die Anzahl der Verschiebungen wird in Register $t6 gespeichert:
m2: and $t7, $t1, $t2
bnez $t7, m3
addi $t6, $t6, 1
sll $t1, $t1, 1
j m2
# In den folgenden Zeilen werden Charakteristik und Mantisse berechnet und
# das Ergebnis in $t5 abgelegt:
m3: # Berechnung der Charakteristik und Verknuepfung mit $t5
addi $t7, $zero, 30
sub $t6, $t7, $t6
addi $t6, $t6, 127
sll $t6, $t6, 0x17
or $t5, $t5, $t6
# Berechnung der Mantisse und Verknuepfung mit $t5
srl $t1, $t1, 0x7
and $t1, $t1, $t4
or $t5, $t5, $t1
# Ausgabe des Strings message1
la $a0, message1
li $v0, 4
syscall
# Ausgabe des Ergebnisses binaer
move $a0, $t5
li $v0, 35
syscall
# Ausgabe des Strings message2
la $a0, message2
li $v0, 4
syscall
# Ausgabe des Ergebnisses hexadezimal
move $a0, $t5
li $v0, 34
syscall
# Ablage des Ergebnisses an der Speicherstelle dst
sw $t5, dst
# exit
li $v0, 10
syscall