college/ws2010/gdi3/Uebung/floatingStripped.asm
2011-10-24 10:02:02 +02:00

139 lines
2.4 KiB
NASM

.data
fltout: .string "Wert: %f\n"
a: .float 2.76
b: .float -3.12
c: .float 1.2
.text
.globl main
main:
# a * b
movl a, %eax
movl b, %ebx
call fltmul
call fltprint
# b + c
movl b, %eax
movl c, %ebx
call fltadd
call fltprint
# c + a
movl c, %eax
movl a, %ebx
call fltadd
call fltprint
# Exit
movl $1, %eax
int $0x80
/*
Addition zweier float Werte
Eingabe: %eax, %ebx
Ausgabe: %eax
Notizen: --AUSFUELLEN--
*/
fltadd:
ret
/*
Multiplikation zweier float Werte
Eingabe: %eax, %ebx
Ausgabe: %eax
Notizen: --AUSFUELLEN--
*/
fltmul:
ret
/*
Ausgabe einer float Zahl via printf
Wichtig: printf ist leider nur double kompatibel,
daher muss float auf double erweitert werden
auch wenn %f genutzt wird!
Eingabe: %eax
Ausgabe: ---
*/
fltprint:
pusha
call extend # Wegen printf auf double erweitern
pushl %edx
pushl %eax
pushl $fltout
call printf
addl $12, %esp
popa
ret
/*
Erweitert ein float in double
Eingabe: %eax
Ausgabe: %edx:%eax
Notizen: %ebx enthaelt dauerhaft den float-Wert
%ecx:%edx Zwischenergebniss der Erweiterung
%edx enthaelt Differenz der Exponenten
*/
extend:
pushl %ebx
pushl %ecx
movl %eax, %ebx # Sicherung des floats
call sign # Vorzeichen extrahieren
movl %eax, %ecx # ecx:edx wird double enthalten
movl %ebx, %eax
call exponent # Exponent extrahieren
addl $896, %eax # Exponent erweitern -127 +1023
shll $11, %ecx
orl %eax, %ecx # An ecx anhaengen
movl %ebx, %eax
call significand # Mantisse extrahieren
movl %eax, %edx
shrl $3, %eax # Nur 20 Bit passen noch dran
shll $20, %ecx
orl %eax, %ecx
shll $29, %edx # Mantisse erweitern
movl %edx, %eax # Ausgabe setzen
movl %ecx, %edx
popl %ecx
popl %ebx
ret
/*
Vorzeichen des floats extrahieren
Ein-/Ausgabe: %eax
Notizen: --AUSFUELLEN--
*/
sign:
ret
/*
Exponent des floats extrahieren
Ein-/Ausgabe: %eax
Notizen: --AUSFUELLEN--
*/
exponent:
ret
/*
Mantisse des floats extrahieren
Ein-/Ausgabe: %eax
Notizen: --AUSFUELLEN--
*/
significand:
ret