1. 按照默认设定创建一个控制台程序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;
}
上面代码对应在调试时对应的汇编代码为:
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
0040107F pop ebx
20: pop ebx
00401080 pop ebx
21: pop ebx
00401081 pop ebx
22: }
编译完成后,执行程序,得到预期结果: Hello world
2. 还是上面的例子,设置Project/Setting的General的Microsoft Foundation Class使用的是: using mfc in shared dll
还是上面的代码程序,在调试的时候,得到的汇编代码如下:
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的时候,出现的汇编代码的不同,主要是在调用函数printf的时候,有不同,分别为: call __imp__printf (004150a8) 和call printf (004011f0)
在执行使用using mfc in shared dll 编译生成的执行文件时,会出现异常,得不到正常的结果.
但如果把call printf换成 call DWORD PTR[printf],程序有可以正常运行了. 这就是同一个函数因为使用了不同的库而出现的不同的结果。
因此进行了如下总结:
1. 使用静态编译和不使用mfc编译的时候,通过call ****,直接调用c的函数库函数.
2. 如果使用动态库进行编译,则应该call DWORD PTR[****]去调用函数。