#include <stdio.h>

char *szCaption = "Hello,World";

void main()

......{
char *szformat = "%s %s ";
char szMsg[] = "I Love You";
try

......{

_asm......{
lea eax, szMsg
push eax
mov eax, szCaption ;全部变量为指针的引用
push eax
mov eax, szformat
push eax
mov eax, printf
call eax

//内联汇编调用c函数必须自己清除堆栈
//用不使用的ebx寄存器清除堆栈,或add esp, 12
pop ebx
pop ebx
pop ebx
}

}catch(CException* e)......{
;
}
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char szCaption[] = "Hello,World";

void main()

......{
char *szformat = "%s %s ";
char szMsg[] = "I Love You";
try

......{

_asm......{
lea eax, szMsg
push eax
mov eax, offset szCaption ;全部变量非指针的引用
push eax
mov eax, szformat
push eax
mov eax, printf
call eax

//内联汇编调用c函数必须自己清除堆栈
//用不使用的ebx寄存器清除堆栈,或add esp, 12
pop ebx
pop ebx
pop ebx
}

}catch(CException* e)......{
;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>

#include <windows.h>
void main()

...{
char szMsg[] = "I Love You";
char *szCaption = "Hello,World";
try

...{

_asm...{
push MB_OK or MB_ICONINFORMATION
mov eax, szCaption ;局部变量为指针类型时可直接用mov
push eax
lea eax,szMsg ;局部变量用lea
push eax
push 0
mov eax, dword ptr [MessageBox] ; 获得MessageBox的地址;不能直接call dword ptr [MessageBox] ,因为静态地址不能转换为动态地址,即函数在dll中的地址没有转化为程序运行中的相对地址
call eax
}
}catch(CException* e)

...{
;
}
}
为什么调用printf的时候不加是call printf 而调用messagebox的时候就是call [messagebox]
回答:
printf 是标准的c/c++函数
messagebox不是标准的c/c++函数, 而是api函数。
由于是系统运行库函数, messageboxa 指向的不是函数,而是存储函数指针的地址,所以为二次指针。 printf 是函数指针。