• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            coreBugZJ

            此 blog 已棄。

            匯編調用 C 語言 printf %f 輸出浮點數 float 的問題:4字節 還是 8字節


             1 
             2 // 畢業論文做Pascal編譯器,把編譯生成的中間代碼翻譯為 nasm 匯編調用 C 語言庫函數時,在輸出 float 部分出現問題。
             3 
             4 
             5 // 先說明一下,我安排棧中數據 8字節對齊,不管數據實際大小,都分配 8字節,按最低字節尋址。
             6 // 當然,調用 C 語言函數時的參數棧,還是按 i386 的來。
             7 
             8 
             9 // C printf 格式化字符串
            10 data.add( head + "c_format_float32 : db \'%f\', 0" );
            11 data.add( head + "c_format_float64 : db \'%lf\', 0" );
            12 data.add( head + "c_format_float64G: db \'%G\', 0" );
            13 
            14 
            15 // 棧頂已經是 8字節的 ieee754 double 數據,然后
            16 text.add( line + "push dword c_format_float64G" );
            17 // 或 text.add( line + "push dword c_format_float64" ); 也正確
            18 text.add( head + "call printf" );
            19 text.add( head + "add esp, 12" );
            20 // 生成可執行文件后,運行輸出正確
            21 
            22 
            23 // 棧頂已經是 4字節的 ieee754 float 數據,且不等于0(次棧頂 4字節全零),然后
            24 text.add( line + "push dword c_format_float32" );
            25 text.add( head + "call printf" );
            26 text.add( head + "add esp, 12" );
            27 // 生成可執行文件后,運行輸出 0.000000
            28 
            29 
            30 // 正確的是
            31 // 棧頂已經是 4字節的 ieee754 float 數據,然后
            32 // 先把4字節的float 轉為 8字節的double
            33 text.add( line + "fld dword [esp]" );
            34 text.add( head + "fstp qword [esp]" ); // 8字節對齊,未覆蓋棧中數據
            35 text.add( head + "push dword c_format_float32" );
            36 text.add( head + "call printf" );
            37 text.add( head + "add esp, 12" );
            38 // 生成可執行文件后,運行輸出正確
            39 
            40 

            結論:
             C 語言的 printf 使用 %f 來輸出 float 時,實際上先把 4字節的float轉化為 8字節的double,然后訪問了棧上的 8字節數據。

            (環境:Ubuntu12.04 32位 intel i3 nasm gcc)

            posted on 2013-04-29 16:51 coreBugZJ 閱讀(3179) 評論(2)  編輯 收藏 引用 所屬分類: AssembleLinuxCPUGPUProgrammingLanguage

            Feedback

            # re: 匯編調用 C 語言 printf %f 輸出浮點數 float 的問題:4字節 還是 8字節 2013-05-09 19:17 ilvu

            印象里可變參數壓棧是4字節對齊的。試一試char作為參數看看。  回復  更多評論   

            # re: 匯編調用 C 語言 printf %f 輸出浮點數 float 的問題:4字節 還是 8字節 2013-05-09 22:34 coreBugZJ

            @ilvu
            i386的參數原則上全都放在棧中,是4字節對齊的,char和short也是4字節對齊。  回復  更多評論   


            久久WWW免费人成—看片| 久久久久综合网久久| 一本久久免费视频| 久久亚洲欧美国产精品| 久久精品视频免费| 伊人伊成久久人综合网777| 色8久久人人97超碰香蕉987| 91久久精一区二区三区大全| 久久影视综合亚洲| 91久久精一区二区三区大全| 久久亚洲欧洲国产综合| 精品无码久久久久国产| 狠狠色丁香久久婷婷综合_中| 久久国产精品无码HDAV| 性做久久久久久久久浪潮| 久久美女网站免费| 一本久久a久久精品vr综合| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 午夜精品久久久久久影视777| 五月丁香综合激情六月久久| 久久久久一本毛久久久| 青青草原综合久久大伊人精品| 国产精品99久久久久久宅男小说| 中文字幕久久欲求不满| 91精品国产高清久久久久久io| 久久精品国产2020| 久久这里有精品| 一本一道久久a久久精品综合| 久久WWW免费人成—看片| 久久精品国产免费| 久久亚洲国产中v天仙www| 国产综合久久久久| 久久国产精品99精品国产| 日韩人妻无码一区二区三区久久| 久久久久久久久久久久久久| 女同久久| 久久精品久久久久观看99水蜜桃 | 精品国产99久久久久久麻豆| 伊人精品久久久久7777| 欧美亚洲国产精品久久| 2020久久精品亚洲热综合一本|