x86 浮點運算

初學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 計算sinfadd

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那下手冊)

 

注意到這…………然後就沒問題了

看來以後不能望文生義了,不然那個悲劇

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章