2016-08-01 14 views
0

Schreiben Sie ein HLA-Assemblerprogramm, das die Fläche basierend auf einem Radius berechnet. Ein Beispielprogrammdialog ist unten gezeigt. Wie auch immer Sie sich entscheiden, Ihr Hauptprogramm sollte das Aufrufen einer Prozedur oder Funktion (mindestens eines ...) beinhalten, um dieses Problem zu lösen.HLA-Oberflächenprogrammfehler in der Ausgabe

Ich habe meinen Code geschrieben, aber bekommen "####" als die Ausgabe der Oberfläche heren meinen Code:

program surfaceArea; 
#include("stdlib.hhf"); 
static 
radius : real32; 

procedure computeSurfaceArea(r : real32); @nodisplay; @noframe; 
static 
returnAddress : dword; 
area : real32; 

begin computeSurfaceArea; 

pop(returnAddress); 
pop(r); 
push(returnAddress); 

finit(); 
fld(r); 
fld(st0); 
fmul(); 

fldpi(); 
fld(4.0); 
fmul(); 

fmul(); 

fstp(area); 
stdout.putr32(area, 4, 10); 
ret(); 
end computeSurfaceArea; 

begin surfaceArea; 

stdout.put("Lemme calculate the surface area of a sphere!", nl); 
stdout.put("Gimme r: "); 
stdin.get(radius); 
stdout.put("Surface area = "); 
call computeSurfaceArea; 

end surfaceArea; 
+1

Ich weiß nicht, hla (und ich werde nie den Punkt des Mangels x86 Assembly absichtlich) aber: 1) Popping die Absenderadresse und drücken Sie es später nur um einen Parameter zu bekommen ist sehr hässlich. 2) wenn 'fmul()' sich in 'fmulp' auflöst, scheint es, dass Sie' 4 * pi * pi' berechnen und Sachen auf dem x87 Stapel hinterlassen. 3) Die Fläche eines Kreises ist 'pi * r^2'. 4) Es scheint, dass Sie 'computeSurfaceArea' ohne seinen Parameter aufrufen. –

+0

Entschuldigung, Sie berechnen die Fläche einer Kugel, nicht die Fläche eines Kreises. Hab das nicht gesehen. –

Antwort

1

Schauen Sie hier: stdout.putr32 (Fläche, 4, 10) ;

Leider haben Sie nicht genügend Feldbreite für den Ausgabetext (Platz für die führenden Zahlen oder die Dezimalstelle) für den Wert angegeben, der korrekt gedruckt werden soll.

stdout.putr32 (r: real32; Breite: uns32; decpts: uns32); Der erste Parameter für diese Prozeduren ist der Gleitkommawert, den Sie drucken möchten. Die Größe dieses Parameters muss mit dem Namen der Prozedur übereinstimmen. Der zweite Parameter gibt die Feldbreite für den Ausgabetext an. Wie die Breite bei der Arbeit mit einem ganzzahligen Wert ist diese Breite die Anzahl der Zeichenpositionen, die die Zahl benötigt, wenn die Prozedur sie anzeigt. Denken Sie daran, eine Position für das Vorzeichen der Zahl und den Dezimalpunkt aufzunehmen. Der dritte Parameter gibt die Anzahl der Druckpositionen an, die nach dem Dezimalpunkt platziert werden sollen. Als ein Beispiel, stdout.putr32 (pi, 10, 4); zeigt den Wert _ _ _ _ 3.1416 an, wobei die Unterstriche zur Darstellung von führenden Leerzeichen verwendet werden.

Ich hoffe, das hilft!