Es soll ein Programm entwickelt werden, das aus einem Radius die Kreisfläche ermittelt. Das geschieht mit der Formel
Radius * Radius * Kreiszahl = Kreisfläche. Gerechnet wird in zwei Schritten: Radius * Kreiszahl = Kreisumfang Radius * Kreisumfang= Kreisfläche. Die Kreiszahl ist keine Ganzzahl, sondern sie hat eine Wert von etwa 3,1425926534... Aber auch der Radius muss nicht unbedingt eine Ganzzahl sein. Er kann z.B 25,4 mm betragen. Solche Zahlen werden als Gleitkommazahlen bezeichnet. Intern sind sie aus drei Bestandteilen zusammengesetzt:
|
Beispiel: Definieren von Gleitkommazahlendd und dq entscheiden über die Länge der internen Darstellung. Enthält die darzustellende Zahl einen Dezimalpunkt, entsteht eine Gleitkommadarstellung (Real). Fehlt der Dezimalpunkt, entsteht eine Ganzzahldarstellung (Integer). Ein Vorzeichen wird im werthöchsten Bit der internen Darstellung gekennzeichnet. Im Beispiel ist dies Bit immer 0, denn es kommen nur positive Zahlen vor.00000044 00000001 dd1 dd 1 ;Ganzzahl 1 00000048 3F800000 dd10 dd 1.0 ;Gleitkommazahl 1 0000004C 3F8CCCCD dd11 dd 1.1 ;Gleitkommazahl 1,1 00000050 3F99999A dd12 dd 1.2 ;Gleitkommazahl 1,1 ;Es folgen Zahlendefinitionen mit 8 Bytes Speicherbelegung 00000054 dq1 dq 1 ;Ganzzahl 1 0000000000000001 0000005C dq10 dq 1.0 ;Gleitkommazahl 1 3FF0000000000000 00000064 dq11 dq 1.1 ;Gleitkommazahl 1,1 3FF199999999999A 0000006C dq12 dq 1.2 ;Gleitkommazahl 1,2 3FF3333333333333 Außerdem existiert noch eine 10 Byte lange Darstellung von Gleitkommazahlen. Sie basiert auf binär codierter Dezimalzahlendarstellung, d.h. die Inhalte der beteiligten Halbbytes sind auf die binäre Darstellung der Ziffern von 0 bis 9 beschränkt. Insgesamt können Gleitkommazahlen im Speicher mittels
|
Das Rechnen mit Gleitkommazahlen überlässt man zweckmäßigerweise dem mathematischen Coprozessor. Er ist ab der CPU 80486 Bestandteil der CPU. Allerdings benötigt er ein eigenes Programmierverfahren. Bei Verwendung des MASM32-SDKs wird die Programmierung des mathematischen Coprozessors (FPU wie floating point unit) wesentlich erleichtert: Es steht eine geeignete Hilfsbibliothek zur Verfügung. Sie ermöglicht die Nutzung der FPU, ohne dass man allzu tief in deren Besonderheiten einsteigen muss. Das folgende Assemblerprogramm nutzt die Hilfsbibliothek, um die Kreisfläche zu errechnen. Der einzige Schönheitsfehler ist, dass sich der Radius nicht über die Tastatur eingeben lässt. Aber das Programm zeigt, wie man ASCII-Strings passend für die Verarbeitung durch die FPU aufbereiten kann. Außerdem zeigt es, wie man das von der FPU ermittelte Ergebnis auf dem Bildschirm anzeigen kann. |
Bei dem folgenden Programm handelt es sich um ein Übungsprogramm. Somit fehlt die Eingabe des Kreisradius per Tastatur. Wie dies im Prinzip gemacht wird, geht aus einer vorherigen Webseite hervor.
;Beispiel Errechnen der Kreisflaeche. ;Es handelt sich um eine Ueberarbeitung eines Beispiels ;aus der Hilfe des MASM32-SDKs. Ziel der Ueberarbeitung ;war es, ein wesentlich unkomplizierteres und somit ;leichter verstaendliches Beispiel zu schaffen. ;Es wird zunaechst ein Kreisumfang aus Radius * Phi und anschliessend ;die zugehoerige Kreisflaeche aus Umfang * Radius errechnet. ;Die ermittelte Kreisflaeche wird mit einer Messagebox dargestellt. .486 .model flat, stdcall option casemap :none ; case sensitive ; ------------------------------------------- .XLIST include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\Fpu.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\Fpu.lib .LIST ; ------------------------------------------- .data radius dt 0 phi dt 0 ;unbenutzter Speicherplatz radius_inp db "2",0 phi_inp db "3.141592654",0 result db 25 dup(0) MsgBoxCaption db "Kreisflaeche",0 .code start: ;konvertiere radius_inp in REAL10 und speichere es als radius invoke FpuAtoFL, ADDR radius_inp, ADDR radius, DEST_MEM ;convert phi_inp in REAL10 und speichere es in der FPU invoke FpuAtoFL, ADDR phi_inp, 0, DEST_FPU ;Multipliziere radius mal phi. dies ergibt den umfang. er steht in der fpu invoke FpuMul, 0, ADDR radius, 0, SRC1_FPU or SRC2_REAL or DEST_FPU ;multiply radius mal umfang. dies ergibt die flaeche. sie steht in der fpu invoke FpuMul, 0, ADDR radius, 0, SRC1_FPU or SRC2_REAL or DEST_FPU ;konvertiere das ergebnis (die flaeche) in ASCII mit 4 nachkommstellen invoke FpuFLtoA, 0, 4, ADDR result, SRC1_FPU or SRC2_DIMM invoke MessageBox, 0, ADDR result, ADDR MsgBoxCaption, MB_OK invoke ExitProcess, 0 end start ![]() Berechnet wurde die Fläche eines Kreises mit dem Radius 2. |
Interpretation des Programmes
|
Linkhinweis→SIMPLY FPU by Raymond Filiatreault ist eine gut verständliche Beschreibung der FPU-Programmierung. Der Text ist in amerikanischem Englisch. |