在看chm文档里vc内嵌汇编的时候,有几点不明白,请帮助

间谍 2003-11-28 08:53:40
为什么调用printf的时候不加是call printf
而调用MessageBox的时候就是call [MessageBox]

以下是原文:

#include <windows.h>

char szAppName[] = "API Test";

void main()
{
char szHello[] = "Hello, world!";

__asm
{
PUSH MB_OK OR MB_ICONINformATION
PUSH OFFSET szAppName ; 全局变量用OFFSET
LEA EAX, szHello ; 局部变量用LEA
PUSH EAX
PUSH 0
CALL DWORD PTR [MessageBoxA]
}
}
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#include <stdio.h>

char szformat[] = "%s %s\n";
char szHello[] = "Hello";
char szWorld[] = " world";
void main()
{
__asm
{
MOV EAX, OFFSET szWorld
PUSH EAX
MOV EAX, OFFSET szHello
PUSH EAX
MOV EAX, OFFSET szformat
PUSH EAX
CALL printf

//内联汇编调用C函数必须自己清除堆栈
//用不使用的EBX寄存器清除堆栈,或ADD ESP, 12
POP EBX
POP EBX
POP EBX
}
}






为什么调用printf的时候不加是call printf
而调用MessageBox的时候就是call [MessageBox]
...全文
29 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
W32API 2003-11-29
  • 打赏
  • 举报
回复
由于是系统运行库函数,
MessageBoxA 指向的不是函数,而是存储函数指针的地址,所以为二次指针。

printf 是函数指针。
间谍 2003-11-29
  • 打赏
  • 举报
回复
请问这个是硬性规定吗?调用API必须加[ ],而其它函数都不必要[ ]??
紫郢剑侠 2003-11-28
  • 打赏
  • 举报
回复
printf 是标准的C/C++函数

MessageBox不是标准的C/C++函数, 而是API函数。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧