139 lines
2.4 KiB
NASM
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 |