89 lines
2.5 KiB
NASM
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
|