汇编语言怎样调用Win Api ??

whupyf 武汉大学 2003-07-05 04:49:19
我反汇编了一段程序。
可是不知道这个程序是怎样调用Api的.

请高手指点下
...全文
116 1 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
smuwcwt 2003-08-01
学习学习
回复
Yashmak 2003-07-31
invoke是个伪指令,
编译器会把它展开为
push 参数n
......
push 参数1
call 函数名(或地址)
返回值在eax中

当然,你要在文件头包含API的导入表

include ***.inc
includelib ***.lib
回复
ckp 2003-07-29
我的肚子有点痛.:-)哈
回复
ckp 2003-07-29
哈,楼上好有趣:-)
回复
W32API 2003-07-29
拜托,不要开口就调用我好不好?
回复
jzma 2003-07-29
就是在函数名后加伪指令PROTO,再跟一串由逗号相隔的数据类型链表。在前面的 ExitProcess 定义中,该函数有一个 DWORD 类型的参数。当您使用高层调用语句 INVOKE 时,使用函数原型定义特别有用,您可以简单地认为 INVOKE 是一个有参数类型检查的调用语句。譬如,假设您这样写:

call ExitProcess

若您事先没把一个DWORD类型参数压入堆栈,编译器和链接器都不会报错,但毫无疑问,在您的程序运行时将引起崩溃。但是,当您这样写:

invoke ExitProcess

连接器将报错提醒您忘记压入一个 DWORD 类型参数。所以我建议您用 INVOKE 指令而不是CALL去调用一个函数。INVOKE 的语法如下:

INVOKE expression [,arguments]

expression 既可以是一个函数名也可以是一个函数指针。参数由逗号隔开。大多数API函数的原型放在头文件中。 如果您用的是 hutch 的 MASM32,这些头文件在文件夹MASM32/include 下, 这些头文件的扩展名为 INC,函数名和 DLL 中的函数名相同,譬如:KERNEL32.LIB 引出的函数 ExitProcess 的函数原形声明于kernel.inc中。您也可以自己声明函数原型。
回复
jzma 2003-07-16
提议返汇编,最好使用ida,里面写的非常清楚了
回复
cupidvenus 2003-07-15
同意
回复
bahanzo1 2003-07-07
invoke <函数名> 参数
回复
神农氏 2003-07-07
基本同意楼上!
如调用MessageBox:
push MB_OK
push offset szText
push offset szCaption
push NULL
call dword ptr ds:[address]
address 是导入函数地址表的地址。
回复
紫郢剑侠 2003-07-07
这要看你所使用的开发环境了.

如果用TASM
就要用CALL指令.如调用MessageBox:

push MB_OK
push offset szAppName
push offset szAppName
push hWnd
call MessageBox

如果是用MASM32,
可以用INVOKE伪指令.如调用MessageBox:

invoke MessageBox, hWnd, addr szAppName, addr szAppName, MB_OK
回复
hotrain 2003-07-05
调用WIN32 API要在汇编语言的源程序开头声明函数和库。
至于INVOKE嘛,是一个伪操作,就相当于一连串的PUSH和一个CALL,使用INVOKE可以增强程序的可读性。如果不使用INVOKE的话,可以自己把相应的参数PUSH入栈,然后CALL相应的函数就可以了,不过要注意PUSH的顺序,后面的参数应该先入栈。
回复
csdn20032004 2003-07-05
正常的Win32 汇编语言都是在程序的头部加上函数的声明以及库。
然后指定调用方式,即参数的调用方向,然后在程序中使用invoke 语句进行Api的调用。

回复
发动态
发帖子
汇编语言
创建于2007-08-27

2.0w+

社区成员

汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
申请成为版主
社区公告
暂无公告