ASM Projekt 13 - Realisierung

 

Gliederung

  1. ASMCOS (Hauptroutine)
  2. TRUNC (Hilfsroutine)


Projektüberblick ASM Frames anzeigen
Zurück zur Homepage

ASMCOS (Hauptroutine)

Da die Routine unter Delphi getestet und angewandt werden soll, wird der Parameter vom CPU Stack in den FPU Stack übernommen.

Zu Beginn wird der Betrag des Parameters entsprechend der Spezifikation durch 2π geteilt woraufhin dann bei dem Ergebnis in der Unterroutine TRUNC alle Nachkommastellen entfernt werden. Beim anschließenden Rücksprung in die Hauptroutine wird dieses ganzzahlige Ergebnis der Division des gegebenen Parameters durch 2π wieder mit 2π multipliziert. Nachdem dieser Wert dann von dem ursprünglichen Argument subtrahiert wurde, liegt ein entsprechender Parameter zwischen 0 und 2π vor. Davon wird dann π abgezogen?

In der Schleife L1 wird dann lediglich das Hornerschema abgearbeitet. Hier zeigt sich auch der große Vorteil dieser Vorgehensweise gegenüber einer Berechnung über die Reihe für den Cosinus, wie sie ursprünglich gegeben ist. Mit Hilfe des Hornerschemas ist es möglich, die gesamte Berechnung auf nur einem Register durchzuführen, ohne daß eine Zwischenspeicherung von Zwischenergebnissen nötig wäre.

Die Anzahl der Iterationen beträgt 16. Durch Versuche mit einer verschiedenen Anzahl von Iterationen hat sich herausgestellt, daß so eine ausreichende Genauigkeit erzielt, und trotzdem nicht unnötig lange gerechnet wird. Abschließend wird das Ergebnis invertiert und zurückgegeben.



Projektüberblick ASM Frames anzeigen Zum Seitenanfang
Zurück zur Homepage

TRUNC (Hilfsroutine)

Das Prinzip der Unterroutine TRUNC ist folgendes: um aus dem Ergebnis der Division des Argumentes durch 2π den ganzzahligen Teil zu extrahieren, überschreibt man alle Nachkommastellen der Mantisse mit 0-Bits. (Darstellung von Gleitkommazahlen nach dem IEEE-754 Standard)

Hierzu wird zunächst aus dem Exponententeil der vorliegenden Fließkommazahl, der ja lediglich relativ vorliegt durch Subtraktion von 16383 der reale Exponent berechnet.

An dieser Stelle werden zwei Spezialfälle abgeprüft:

Normalerweise liegt das Komma innerhalb der Mantisse. In diesem Fall wird durch Subtraktion des Exponenten von 63 die Anzahl der zu schreibenden Nullbits ermittelt. Dies geschieht in der Unterroutine ROUND_LOOP, die die Mantisse byteweise von hinten nach vorne wandernd mit Nullbytes überschreibt, bis die Anzahl der Nullbits kleiner als 8 ist. Dann erfolgt ein Sprung in eine weitere Unterroutine ( FINISH_ZEROS), wo im Register CL ein Byte erzeugt wird, das vorne nur aus 1-Bits und hinten aus genau so vielen 0-Bits besteht, wie noch zu löschen sind. Im letzten Schritt erfolgt eine logische UND-Verknüpfung dieses Bytes mit dem Byte der Mantisse, in der sich das Komma befindet. Dadurch werden alle Vorkommastellen erhalten und alle Nachkommastellen auf 0 gesetzt. Dann wird die erzeugte ganze Zahl auf den FPU-Stack geladen und das Programm springt zurück in die Hauptroutine.

Download des Quellcodes



Projektüberblick ASM Frames anzeigen Zum Seitenanfang
Zurück zur Homepage