怎么樣在C\\C++中嵌入?yún)R編呢?下面我們用三篇文章來(lái)說(shuō)明這個(gè)問(wèn)題。
1. 按照默認(rèn)設(shè)定創(chuàng)建一個(gè)控制臺(tái)程序TestAsm,在Project/Setting的General的Microsoft Foundation Class使用的是: not using mfc
#include <stdio.h>
char format[] = \"%s %s\\n\";
char hello[] = \"Hello\";
char world[] = \"world\";
int main( void )
{
__asm
{
mov eax, offset world
push eax
mov eax, offset hello
push eax
mov eax, offset format
push eax
call printf
pop ebx
pop ebx
pop ebx
}
return 0;
}
上面代碼對(duì)應(yīng)在調(diào)試時(shí)對(duì)應(yīng)的匯編代碼為:
10: __asm
11: {
12: mov eax, offset world
00401068 mov eax,offset world (00422a40)
13: push eax
0040106D push eax
14: mov eax, offset hello
0040106E mov eax,offset hello (00422a38)
15: push eax
00401073 push eax
16: mov eax, offset format
00401074 mov eax,offset format (00422a30)
17: push eax
00401079 push eax
18: call printf
0040107A call printf (004011f0)
19: pop ebx[Page]
0040107F pop ebx
20: pop ebx
00401080 pop ebx
21: pop ebx
00401081 pop ebx
22: }
編譯完成后,執(zhí)行程序,得到預(yù)期結(jié)果: Hello world
2. 還是上面的例子,設(shè)置Project/Setting的General的Microsoft Foundation Class使用的是: using mfc in shared dll
還是上面的代碼程序,在調(diào)試的時(shí)候,得到的匯編代碼如下:
10: __asm
11: {
12: mov eax, offset world
00401068 mov eax,offset world (00414420)
13: push eax
0040106D push eax
14: mov eax, offset hello
0040106E mov eax,offset hello (00414418)
15: push eax
00401073 push eax
16: mov eax, offset format
00401074 mov eax,offset format (00414410)
17: push eax
00401079 push eax
18: call printf
0040107A call __imp__printf (004150a8)
19: pop ebx
0040107F pop ebx
20: pop ebx
00401080 pop ebx
21: pop ebx
00401081 pop ebx
22: }
比較一下同一段代碼在使用using mfc in shared dll 和not using mfc的時(shí)候,出現(xiàn)的匯編代碼的不同,主要是在調(diào)用函數(shù)printf的時(shí)候,有不同,分別為: call __imp__printf (004150a8) 和call printf (004011f0)[Page]
在執(zhí)行使用using mfc in shared dll 編譯生成的執(zhí)行文件時(shí),會(huì)出現(xiàn)異常,得不到正常的結(jié)果.
但如果把call printf換成 call DWORD PTR[printf],程序有可以正常運(yùn)行了. 這就是同一個(gè)函數(shù)因?yàn)槭褂昧瞬煌膸?kù)而出現(xiàn)的不同的結(jié)果。
因此進(jìn)行了如下總結(jié):
1. 使用靜態(tài)編譯和不使用mfc編譯的時(shí)候,通過(guò)call ****,直接調(diào)用c的函數(shù)庫(kù)函數(shù).
2. 如果使用動(dòng)態(tài)庫(kù)進(jìn)行編譯,則應(yīng)該call DWORD PTR[****]去調(diào)用函數(shù)。