2016-04-23 16 views
0

Grundsätzlich möchte ich einen Benutzer eingegebenen Wert mit einem festgelegten Wert zu multiplizieren. Der Code funktioniert, wenn sie zusammen auf Benutzereingaben multipliziert wird, jedoch, wenn ich ‚Zahl‘ auf einen Wert (zB: 6) vorgegeben, es wird nicht die Multiplikation tun und gibt 0.Hilfe Hilfe Multiplikation mit FPU in x86 Assembly

_start: 
finit       ; init. the float stack 

output inprompt     ; get radius number 
input number, 12    ; get (ascii) value of this number 
pushd NEAR32 PTR number  ; push address of number 
call atofproc     ; convert ASCII to float in ST 

fld st      ; value1 in ST and ST(1) 

mov number, 6 

; If I substitute the line above by the two lines below, it works: 
; output inprompt, 0 
; input number, 12 

pushd NEAR32 PTR number  ; push address of number 
call atofproc     ; convert ASCII to float in ST 

fmul       ; value1*value2 in ST 
fst prod_real     ; store result 


push prod_real     ; convert the results for printing 

lea eax, sum_out    ; get the ASCII string address 
push eax 
call ftoaproc 

output outprompt 
+1

Sie sind sicher, dass 64-Bit-MASM-Code ist? Sieht aus wie 32-Bit. Ich frage nach dem Tag, den du hinzugefügt hast. –

+0

Sie werden den FP-Stack nicht löschen, wenn Sie fertig sind. Sie sollten vielleicht 'fmulp' und' fstp' verwenden. Ich verstehe auch nicht, warum du den ersten Wert mit "fld st" duplizierst. Das Argument arg to 'ftoaproc' könnte auch mit' push offset sum_out' erstellt werden, es sei denn, Sie müssen LEA verwenden, um positionsunabhängigen Code unter Verwendung von RIP-relativer Adressierung zu erstellen. Statt in "prod_real" zu speichern und dann zu schieben, könnten Sie auch Platz auf dem Stapel schaffen und darin speichern. –

Antwort

1

Sie versuchen zu konvertieren 6 von ASCII zu float, und 6 ist ein nicht druckbares Zeichen in ASCII, so dass es nicht in float konvertiert werden kann. Sie müssen 6 zu 54 ändern, das ist die ASCII-Darstellung des Zeichens '6'. Oder Sie könnten die Gleitkomma-Konstante 6.0 übergeben und den Anruf zu atofproc löschen, wenn Sie bevorzugen.

+0

+1 lol Danke. Solch ein einfaches winziges kleines Versehen. – Rijn