Re: [問題] C/C++呼叫組語的程式片段,請問有什麼꘠…
※ 引述《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
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章