2016-04-23 20 views
0

基本的に、ユーザーが入力した値に設定値を乗算したい。一緒にユーザーの入力に掛ける際のコードは、しかし、作品私は値に「番号」(例:6)プリセットあれば、それは乗算を行うことはありませんし、0を返します。x86アセンブリでFPUを使用して乗算する際に助けが必要

_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

確かに64ビットMASMコードですか? 32ビットのように見えます。あなたが追加したタグのために私は尋ねます。 –

+0

完了したらFPスタックをポップしません。おそらく 'fmulp'と' fstp'を使用しているはずです。なぜ私は 'fld st'で最初の値を複製しているのか理解できません。また、 'ftoaproc'への引数は、RIP相対アドレッシングを使って位置に依存しないコードを作るためにLEAを使う必要がない限り、' push offset sum_out'で設定することができます。また、 'prod_real'に格納してプッシュするのではなく、スタックにスペースを入れてそこに格納することもできます。 –

答えて

1

をあなたは変換しようとしていますASCIIから浮動小数点へ6、浮動小数点に変換することができないので、6はASCIIで印刷できない文字です。文字「'6'」のASCII表現である6〜54を変更する必要があります。または、浮動小数点定数6.0を渡し、atofprocへの呼び出しを削除することもできます。

+0

+1 lolありがとうございました。そのような簡単な小さな見落とし。 – Rijn

関連する問題