首页
社区
课程
招聘
[旧帖] VB2008或VB2010可以内联汇编吗?如果可以,请举例简单说明.谢谢!!! 0.00雪花
发表于: 2010-10-20 08:49 20265

[旧帖] VB2008或VB2010可以内联汇编吗?如果可以,请举例简单说明.谢谢!!! 0.00雪花

2010-10-20 08:49
20265
如题,Visual Basic 2008或Visual Basic 2010可以内联汇编吗?如果可以,能给出内联汇编的代码实例吗?小生这里先谢过各位大大了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 196
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
帮忙顶一下。
2010-10-21 08:58
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
帮忙顶一下~~~
2010-10-21 09:05
0
雪    币: 163
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
还是没有大虾帮助一下吗?继续顶……
2010-10-21 10:06
0
雪    币: 1577
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
VS2008的可以编译很多语言的了,汇编的也不例外(刚看了一下,貌似连arm的编译器都有了,实在是强大)。。但是工具的庞大,不是一般人适用。。配置起来也麻烦。。(要是仅仅是想使用汇编的话,用MASM或者TASM在命令行下编译,对于VS来说,有点大材小用了。。
上传的附件:
2010-10-21 20:06
0
雪    币: 163
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我知道VS2008的功能很强大,也非常同意您的观点,不过还是想请教您,如果VB2008可以内联汇编,能不能请您给出代码实例?谢谢先。
2010-10-21 21:29
0
雪    币: 255
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
帮顶一下···················
2010-10-22 08:20
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
使用CallWindowProc  
http://www.bczlw.com/Article/FAQ/bianchengyuyan/VB/2007-3-6/2007030623374630.html
2010-10-22 12:53
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
QTHPCI Microsoft 基础类应用程序
学校实验课时就是这个   
2010-10-25 08:05
0
雪    币: 163
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
晕,大家能不能给出详细的参考地址?CallWindowProc 我用过,但比较麻烦,能不能通过配置,让VB可以像VC或Delphi那样在代码中内联汇编。再次谢谢大家的关注和建议。
2010-10-26 11:12
0
雪    币: 688
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
VB编写的函数一般都是用内联的手法吧~~~~~!
2010-10-26 11:56
0
雪    币: 255
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
似乎有个内连····有句话不连!删了······
2010-10-26 13:38
0
雪    币: 163
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
汗……无语中,貌似大家好像都不大使用VB了。再顶一回……
2010-10-28 09:17
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
帮忙顶一下~~~
2010-10-28 13:10
0
雪    币: 163
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看样子,真的没有人来给指点一下了。我再 顶……
2010-10-29 14:20
0
雪    币: 2109
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
没找到, 只有 VB6 + 插件

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=979418&bbs_page_no=11&bbs_id=1036
"Inline ASM for VB6(VB6内联汇编)插件+测试程序下载"
2010-10-29 15:11
0
雪    币: 209
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
VB不支持内联汇编。
2010-10-29 16:17
0
雪    币: 34
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
看看这个网站吧,里面教人怎么用vs2010汇编程序
http://kipirvine.com/asm/gettingStartedVS2010/index.htm
2010-10-30 17:07
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cpe
19
你试试AsmInVB这个插件
2010-10-30 20:26
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
可以!
VB内嵌汇编语言解决方案
采用调用CallWindowProc API接口,来实现对二进制代码的执行,通过这种方式能使得VB代码达到执行效率等同甚至高过用C++来编制的代码

基本思路:汇编代码,可以存在一个byte类型的数组中,然后通过某种手段,把系统控制权,转交给这段汇编代码,我们的汇编代码段,就得到了执行。但如何让这段汇编代码,获得系统的控制权限呢?查查WIN   API手册,就可以知道有CallWindowProc这个函数。这个函数本是用于调用用户自己定义的窗口过程的,其原形如下:

Function   CallWindowProc   Lib   "user32 "   Alias   "CallWindowProcA "   (ByVal   lpPrevWndFunc   As   Long,   ByVal   hWnd   As     Long,   ByVal   Msg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long

它有5个参数。lpPrevWnFunc是一个long型,等于用户自己窗口过程的地址,其余3个都是窗口过程所必须的参数,详见MSDN.

我们只需要关心第一个参数:lpPrevWndFunc,窗口过程地址。如果,我们把自己的汇编代码地址,传进去会怎么样?当然,CallWindowProc就把这个地址,当成窗口过程地址,然后,调用这段汇编代码了。我们的汇编代码便得到执……

当然,也得装摸做样的吧,将其余4个参数传进去,就传4个0算了,因为这4个参数,我们更本不用,但又是CallWindowProc必须的,不要忘了,我们传进去的lpPrevWndFunc,并非真正的窗口过程地址,而是自己的汇编码地址。

具体一点,比如,我们要嵌入一段什么也不干的汇编代码:

Dim   AsmCode()   as   byte
redim   AsmCode(8)
'生成机器代码
AsmCode(0)   =   &H58   'POP   EAX
AsmCode(1)   =   &H59   'POP   ECX
AsmCode(2)   =   &H59   'POP   ECX
AsmCode(3)   =   &H59   'POP   ECX
AsmCode(4)   =   &H59   'POP   ECX
AsmCode(5)   =   &H50   'PUSH   EAX
'你可以在这里添加你想执行的Asm代码...
'.....如果添加的话,后面的数组偏移需要做相应改动
'你添加的代码在这里结束
'将控制权交还主程序
AsmCode(6)   =   &HC3   'RET
'.....

然后:

CallDllFunction   =   CallWindowProc(VarPtr(AsmCode(0),   0,   0,   0,   0)

VarPtr函数,用于取变量地址。返回一个long   型值。

为什么前面要执行几个pop和一个push呢?因为我们是以一段汇编代码首地址,伪装成一个窗口过程的,系统调用CallWindowProc时,实际上除lpPrevWndFunc,我们还传入了4个参数,就是上面的的4个0,而CallWindoProc函数在调用lpPrevWndFunc这段汇编代码程序时,把其余4个参数是压入了堆栈的。相当于执行了以下代码:

xxxx00A4H:   push   0
xxxx00A6H:   push   0
xxxx00A8H:   push   0
xxxx00AAH:   push   0
xxxx00ACH:   call   VarPtr(AsmCode(0))(这段代码我们是看不见的,是CallWindoProc在内部做的处理)
xxxx00AFH:   ......

因为我们根本没有用到这4个参数,所以我们只需要将它弹出。所以,我们执行了4个POP   ECX,就是把这4个不用的参数弹出,以保持堆栈指针的正确性。但为什么还要,第一句的:POP   EAX,还是因为CallWindowProc把lpPrevWndFunc当成一个窗口过程的原故,因为作为一个正常的窗口过程,在执行Call语句的时候,得把Call语句的下一条指令地址push到堆栈中,用于子程序ret.在上面这段代码就是执行了:push   xxxx00afh.事实上,在CallWindowProc中,实际上隐含执行这么几句,我们必须关心的代码:

push   0;参数入栈
push   0
push   0
push   0
push   xxxx00afh;(当执行call   时,自动执行)

为了能让窗口过程执行结束后堆栈指针保持平衡,当然要执行相应的pop指令,第一个pop   eax是把子程序返回的地址暂时保存在寄存器eax中,然后弹出4个不用的参数。

接着把保存在eax中返回地址,压回堆栈。当执行ret时,就能正确返回到CallWindowProc中了
2010-10-31 10:35
0
雪    币: 163
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
先谢谢你的建议,你给出的网址是以VC++为例子的,有借鉴的意义,虽然不是我想要的,但还是十分感谢你。
2010-11-1 17:32
0
雪    币: 163
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
你给出的示例与说明,我使用过,那是在VB6的环境下。在VB2008上好像有点问题,还是要感谢你的说明与建议。
2010-11-1 17:34
0
游客
登录 | 注册 方可回帖
返回
//