2009年4月11日 星期六

Visual C++跟Masm的糟糕搭配

Visual C++的Inline Assembler很方便,但也有不少問題,Inline Assembler更新的速度跟不上VC的發展速度,很多東西限制一堆;二者是程式碼管理問題,風格混亂的程式碼會讓人頭大。

既然如此,我們就把組語跟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++的參數壓棧順序



4 則留言:

  1. 还是忍不住想说,好多贴的图片看不见呢…………不如都使用本地上传吧…………

    回覆刪除
  2. 這個"正姐"應該是建個java script貼程式碼

    回覆刪除
  3. 板主您好,看到你這篇文章讓我也想學習試試,不知道是否能夠傳一份這個的完整程式,讓我try看看。謝謝~麻煩了!

    s515181@pchome.com.tw

    回覆刪除

 

我們搬家了

新部落格在http://b-plurkers.com/