初學MASM,寫了個程序,涉及到浮點運算,鬱悶了兩天
那個糾結啊,直到今天才搞懂!!!
貌似網上的資料少了點,雖然找到了,可沒太多說明(可能我彙編底子爛的可以吧)
先看看一個簡單的代碼片段
fild
dwRadius
fild
_dwDegree
fldpi
fmul
;角度*Pi
fild
dwPara180
fdivp
st(1),st ;角度*Pi/180
fsin
;Sin(角度*Pi/180)
fild
_dwRadius
fmul
;半徑*Sin(角度*Pi/180)
fadd
;X+半徑*Sin(角度*Pi/180)
fistp
@dwReturn
其實是Copy自羅雲彬《Windows 環境下32位彙編語言程序設計(第2版)》的示例代碼
當初悲劇就是從這裏開始的
明顯啦,fild 指令就是裝入一數,fldpi 裝入Pi
fmul 乘,fdivp 除,fsin 計算sin ,fadd 加
fistp 取數存到@dwReturn
貌似看懂了,好,試試計算點什麼亂七八糟的,比如sin啊,cos啊,小數點相加什麼的
結果,結果呢????
出錯了!!!!!
當時以爲“按理”是對的,可結果總是錯的,無語啊
網上的浮點說的也太可憐了,就跟例子的一樣,
要知道我連指令的確切含義都是猜的呢
額,還真的是猜的
到intel那下了x86的指令手冊,純E的,不錯啊
才恍然大悟~~~
原來
fild 只是裝入整數 (FILD—Load Integer)
fld 纔是浮點的!!!! (FLD—Load Real)
就這已經錯了啊,可憐的娃
同樣fist 也是整數而已 (FIST/FISTP—Store Integer)
浮點的用fst (FST/FSTP—Store Real)
汗哪,不知該怪書上的例子還是怪自己沒好好翻指令
(其實我有翻的,只不過手頭的資料沒浮點的,所以後來纔去intel那下手冊)
注意到這…………然後就沒問題了
看來以後不能望文生義了,不然那個悲劇