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