Re: [問題] C/C++呼叫組語的程式片段,請問有什麼꘠…

看板C_and_CPP (C/C++)作者 (有趣生活)時間18年前 (2006/06/24 13:10), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串1/1
※ 引述《liwmewmew (如果大海能夠...)》之銘言: : 但是無論哪種方法,我都遇到同樣問題 : 兩種方式我都有辦法 讓他們一起合作,但是有一個很大的問題 : 我的合作 頂多是使用 組語的指令 來做暫存器的搬移 : 而組語取亂數 需要call ReadChar以及call RandomRange : 這好像是組語的函式庫(放在Irvine32.lib裡面? 我不把握) : 我不知道該怎麼讓C連組語時 使編譯器看得懂這2個"程序" : 如果看得懂 能夠寫入 : 我是否就可以很輕鬆的達到C++自由使用組語大部份的功能~? : 有辦法 讓Irvine32也跟著一起LINK~? 這樣我就可以用很多"程序"了~? 有辦法的,只需幾個步驟就好 你說你用 VC6,就先開一個 Win32 Console Application 1. 進入功能表 Tools -> Options... 開啟 Options 視窗後,跳到 Directories 那一頁 確定右邊有個下拉方塊在 Include files 的選項 在路徑最下方加入你的 Irvine32.lib 所在路徑 ( 例如那課本提供的安裝程式預設是 C:\Masm615\LIB ) 按下 OK 關閉 Options 視窗 2. 進入功能表 Project -> Settings,選 Link 那頁 Category 欄位選 General (預設) 而 Object/library modules: 那欄中,加入 Irvine32.lib 3. 回到程式碼編輯區 舉個例子,若我要使用 DumpRegs (在 irvine32.lib 裡面那個) 輸入以下程式看看 ===================================== extern "C" void __stdcall DumpRegs(); int main(){ DumpRegs(); return 0; } ===================================== 再按下 [CTRL] + [F5] 會開始編譯 如果成功連結了 irvine32.lib 就會開始執行 我執行後輸出這些,你跑出來也許不同 EAX=CCCCCCCC EBX=7FFDF000 ECX=00000000 EDX=00373318 ESI=02100210 EDI=0012FF80 EBP=0012FF80 ESP=0012FF34 EIP=0040102D EFL=00000202 CF=0 SF=0 ZF=0 OF=0 以上就是所有步驟,可以讓你在 VC 中使用 irvine32.lib 內的程序 (說函式也行) ps. (I) 也可以不需要 2. 的步驟,而是直接在程式碼加入一行: #pragma comment(lib,"Irvine32") (II) 上面程式的 extern "C" 只在你寫 C++ 程式時需要,若是在寫 C 就不用了 (III) 上面程式的 __stdcall 一定要寫,這樣才會符合原先在 irvine32 那些函式 的 calling convention (簡單來說是對函式參數的處理方式 - 順序? 用堆疊? 用暫存器?) 採用不同的 calling convention 會造成最後 compiler 產生的名稱不同 irvine32 裡面那些都是用 __stdcall 上面 "DumpRegs" 最後名稱會變成 "_DumpRegs@0" 如果都沒寫,預設是 __cdecl,那 linker 會去找 "_DumpRegs" 就會找不到,連結就會失敗 至於那些命名轉換、以及處理參數的細節,那本課本有寫 我手邊是第四版的,在 8.4.2 節 Language Specifiers 有解說 應該看過就會了解囉 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.70.137.117

06/24 14:17, , 1F
06/24 14:17, 1F

06/24 14:32, , 2F
06/24 14:32, 2F

06/26 10:57, , 3F
06/26 10:57, 3F
文章代碼(AID): #14dCaoco (C_and_CPP)
文章代碼(AID): #14dCaoco (C_and_CPP)