| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1362 人关注过本帖
标题:win32 函数指针的问题
只看楼主 加入收藏
codeos
Rank: 2
等 级:论坛游民
帖 子:8
专家分:10
注 册:2011-2-14
结帖率:0
收藏
已结贴  问题点数:20 回复次数:11 
win32 函数指针的问题
看个情景先:
------------------------------------------------
;code start
 1|_Fun    proc    _Arg    ;自定义的一个子函数,调用时需要传入一个dword类型参数        
 2|    pushad
 3|    mov    eax,esi
 4|   ......              ;总之是一些简单的操作
 5|    popad
 6|    ret
 7|_Fun    endp
 8|
 9|_WinMain    proc        ;主函数
10|    local    @tmp
11|    local    @arg
12|    mov        @arg,1234h
13|    mov        @tmp,offset _Fun
14|    invoke    _Fun,@arg
15|    invoke   
16|_WinMain    endp
;code end
---------------------------------------------------------------
我在主函数_WinMain中invoke了自定义的子函数_Fun,没什么问题;
在代码的第13行我获取了子函数的偏移地址,这样如果我不想用子函数名_Fun去调子函数,
而是想通过那个存放子函数地址的@tmp局部变量去调子函数,该如何操作?
我试过这个样子去调子函数:
    invoke    @tmp,@arg
编译器会报错:error A2190: INVOKE requires prototype for procedure

我应该怎样通过那个子函数的地址去访问带参数的子函数?
搜索更多相关主题的帖子: 函数 cod local start 
2011-03-27 14:25
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:7 
1 函数指针是C里面的概念 在汇编里可以说就是函数第一条指令的地址 甚至 汇编里根本没函数。。

2 这个 最简单的方法是用指令 也就是 类似 push XXX push XXX call 一类的操作 达到你说的的效果 当然麻烦

3 INVOKE requires prototype for procedure 嘛意思呢 简单的说 要求类型声明

invoke这个宏的用法就是你举的 更灵活的用法 这个宏是不支持的

罗云彬大大在写远线程的时候写过一个很灵活的invoke宏 摘录如下

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 将参数列表的顺序翻转

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

reverseArgs   macro arglist:VARARG

        local txt,count

 

      txt   TEXTEQU <>

    count = 0

    for   i,

        count = count + 1

        txt   TEXTEQU @CatStr(i,,<%txt>)

      endm

    if    count GT 0

        txt   SUBSTR  txt,1,@SizeStr(%txt)-1

    endif

      exitm txt

endm

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 建立一个类似于 invoke 的 Macro

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_invoke   macro _Proc,args:VARARG

        local count

 

    count = 0

%   for   i,< reverseArgs( args ) >

          count = count + 1

      push     i

    endm

      call     dword ptr _Proc   

 

endm

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

可以实现 具体的请自行参考《Windows环境下32位汇编语言程序设计》

4 貌似写类型转换也可以 我试试再说罢。。

2011-03-27 20:50
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
;#Mode=CON
;MASMPlus 单文件代码模板 - 控制台程序
;--------------------------------------------------------------------
;单个文件需要指定编译模式,否则默认是EXE方式,在系统设置中可以设置默认是DOS还是Windows.
;编译模式自带了DOS/COM/CON/EXE/DLL/LIB这几种,如果有必要,可以更改ide.ini添加新的编译模式
;当然,更好的是创建为一个工程.更方便及易于管理,使用方法:按Ctrl多选->创建工程.必须有多个文件

.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc

includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm

.data?
    buffer    db 100 dup(?)
    lpFunc    dd ?
.CODE

Func typedef proto :DWORD

_Func proc _Arg
    invoke StdOut,CTXT("Hello World!")
    ret
_Func endp

START:
   
    mov lpFunc,_Func
    invoke (Func ptr _Func),5
   
    ;暂停显示,回车键关闭
    invoke StdIn,addr buffer,sizeof buffer
    invoke ExitProcess,0
   
end START
2011-03-27 21:02
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
对于win32asm来说写这种类型转换挺无聊的

上面的也实现了这个功能 但比较难理解

三种方法 自己选一种罢。。
2011-03-27 21:03
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
哦 我给的那个需要MasmPlus支持 不过你看主要的代码就好了

Func typedef proto :DWORD

invoke (Func ptr _Func),5

牵扯到typedef prote ptr的用法 有兴趣自己学 不会再来问
2011-03-27 21:05
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:7 
proto吧  最简单。push/call 也行  注意类型。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2011-04-02 09:49
cacker
该用户已被删除
收藏
得分:7 
提示: 作者被禁止或删除 内容自动屏蔽
2011-04-02 23:14
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
汇编里貌似没有类型的概念 我觉得这个概念关键看怎么说。。
2011-04-04 12:48
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
还有 初学能思考到这个问题很不错。。
2011-04-04 12:49
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
其实楼主的代码是挺不错。只不过我们看不习惯而已。
win32宏汇编还是有类型的。即使是纯粹的汇编,逻辑上还是
有类型的。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2011-04-04 16:56
快速回复:win32 函数指针的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031469 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved