看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) vc2008 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) http://www.codeproject.com/KB/cpp/Sqrt_Prec_VS_Speed.aspx for sqrt14 (__asm) 問題(Question): 我於 codeproject 找了一份 sqrt 14 種算法 (其實是要加速) 在 vc2008 下, .cpp 是可以過, 若為 .c 會出現錯誤結果, Q1 : 另其中 __declspec (naked) __fastcall 這二個是幹嘛的我看了 document 還是看得很花, 把這二個關鍵字拿掉 .cpp 還是可以正常執行, 看起來似乎不影響結果。 錯誤結果(Wrong Output): 副檔名 .cpp 正確無誤 副檔名 .c 出現以下錯誤結果 error C2054: 在 'inline' 之後必須有 '(' error C2085: 'sqrt14' : 不在型式參數清單中 error C2143: 語法錯誤 : 遺漏 ';' (在 '{' 之前) warning C4013: 'sqrt14' 未定義; 假設 extern 傳回整數 程式碼(Code):(請善用置底文網頁, 記得排版) double inline __declspec (naked) __fastcall sqrt14(double n) { _asm fld qword ptr [esp+4] _asm fsqrt _asm ret 8 } int main() { sqrt14(2.0); return 0; } 補充說明(Supplement): Q2 : 手邊全都用 C 語言開發,日前是為養成良好習慣且方便移植,所以還是用 .c 但發現 VC 對於 .c 支援實在是差到一種程度! 若日後將所有 .c 全都改成 .cpp (仍是以 C 開發), 試問此舉是否為埋下地雷之作法? 問題有些長,謝謝各位細心看完,非常感激! -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.73.222
purpose:一般正常的 (沒特別修改) C 函數,反組譯後的 Prologue 04/29 16:58
purpose:或 Prolog 在寫什麼有看懂,應該就能理解 naked、fastcall 04/29 16:59
tropical72:反組譯..是從 exe 反組回去嗎?這部份還真沒研究 XD 04/29 17:17
tropical72:謝謝 purpose 指引方向. 04/29 17:17
tropical72:順帶一問,VC(旗鑑) 裡是否有tool 可反組譯? 04/29 17:18
purpose:比如說,你用VC在自己的main下中斷點,然後開始偵錯,停在 04/29 17:31
purpose:該中斷點,這時候按右鍵應該有「移至反組譯碼」就是了 04/29 17:32
purpose:數學加速什麼的我完全不懂,但是他這個Sqrt14乍看之下 04/29 17:33
purpose:很有趣,他用inline表示不想變成函數。卻又用__fastcall這 04/29 17:33
purpose:個呼叫慣例,想要把n用暫存器來傳送,偏偏最後又從esp+4 04/29 17:34
purpose:這個「記憶體」位址去將浮點數載入CPU,而且也只是用普通 04/29 17:35
purpose:x87指令集裡的fsqrt來達成,關鍵部份都是CPU在做而已 04/29 17:35
tropical72:試了一下,真的可以看 asm code,謝謝 purpose 指教!! 04/29 17:47