既然如此,我們就把組語跟C/C++ Code分離吧。
寫個範例程式,三個整數相加,來展示一下如何跟組語作連結,以及不同Calling Conversion,產生的不同Signature和Parameter passing method。
注意︰__fastcall的Parameter passing每家Compilier實作方式不一定相同,這裡僅列出Visual C++的實作方式。
// CallingConversion could be __cdecl, __stdcall, __fastcall
#define CallingConversion __cdecl
#include <stdio.h>
extern "C" {
int CallingConversion add3(int a, int b, int c);
};
int main()
{
printf("%d\n", add3(1, 2, 3));
}
範例Assembler Code
.386
.model flat
.code
; used for __cdecl
_add3 proc
mov eax, [esp + 4]
add eax, [esp + 8]
add eax, [esp + 12]
ret
_add3 endp
; used for __stdcall
_add3@12 proc
mov eax, [esp + 4]
add eax, [esp + 8]
add eax, [esp + 12]
ret 12
_add3@12 endp
; used for __fastcall
@add3@12 proc
mov eax, ecx
add eax, edx
add eax, [esp + 4]
ret 4
@add3@12 endp
end
參考文獻
1. Argument Passing and Naming Conventions
2. C/C++的參數壓棧順序
組語離我好遠了...QQ
回覆刪除还是忍不住想说,好多贴的图片看不见呢…………不如都使用本地上传吧…………
回覆刪除這個"正姐"應該是建個java script貼程式碼
回覆刪除板主您好,看到你這篇文章讓我也想學習試試,不知道是否能夠傳一份這個的完整程式,讓我try看看。謝謝~麻煩了!
回覆刪除s515181@pchome.com.tw