vb.net调用一段汇编 vbnet using

如何在VB中使用汇编代码呢?其实在VB中是不能直接使用汇编语言vb.net调用一段汇编的,但是可以采用变通vb.net调用一段汇编的方法,将汇编语言编译成二进制代码后,就可以在VB中使用vb.net调用一段汇编了 。
下面的代码以二进制代码的方式实现了无符号长整数的位移操作,因为VB不支持无符号长整数,要实现相同的功能比较麻烦而且效率低 , 要用汇编语言就简单多了 。
Option
Explicit
Private
Declare
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
Private
Sub
Form_Load()
bin(0)
=
H824448B
bin(1)
=
H448B088B
bin(2)
=
H108B0424
bin(3)
=
H1089EAD3
bin(4)
=
H10C2C033
bin(5)
=
H90909000
a
=
HFFFFFFFF
b
=
8
CallWindowProc
VarPtr(bin(0)),
VarPtr(a),
VarPtr(b),
0,
Debug.Print
Hex(a)
End
Sub
这段代码执行了a=a8这样一个操作
其中
bin(0)
=
H824448B
bin(1)
=
H448B088B
bin(2)
=
H108B0424
bin(3)
=
H1089EAD3
bin(4)
=
H10C2C033
bin(5)
=
H90909000
是下面的C++代码编译后的二进制代码
long
CALLBACK
a_lm(HWND
a,
UINT
b,
UINT
c,
UINT
d)
{
(*(UINT*)a)=(*(UINT*)b);
return
0;
}
其对应的汇编语言如下
mov
eax,dword
ptr
[esp+8]
mov
ecx,dword
ptr
[eax]
mov
eax,dword
ptr
[esp+4]
mov
edx,dword
ptr
[eax]
shr
edx,cl
mov
dword
ptr
[eax],edx
xor
eax,eax
ret
10h
nop
nop
nop
用long
CALLBACK
a_lm(HWND
a,
UINT
b,
UINT
c,
UINT
d)这种形式 , 就可以直接用CallWindowProc来调用 。

VB.NET怎么调用其它模块的过程?调用过程,调用过程有诸多技巧,它们与过程的类型、位置以及在应用程序中的使用方式有关 。下面说明如何调用 Sub 过程和 Function 过程 。
调用 Sub 过程
与 Sub 过程不同,在表达式中,Sub 过程不能用其名字调用 。调用 Sub 过程的是一个独立的语句 。Sub 过程还有一点与函数不一样,它不会用名字返回一个值 。但是 , 与 Function过程一样,Sub 过程也可以修改传递给它们的任何变量的值 。
调用 Sub 过程有两种方法:
'以下两个语句都调用了名为 MyProc 的 Sub 过程 。
【vb.net调用一段汇编 vbnet using】Call MyProc (FirstArgument, SecondArgument)
MyProc FirstArgument, SecondArgument
注意,当使用 Call 语法时,参数必须在括号内 。若省略 Call 关键字,则也必须省略参数两边的括号
调用函数过程
通常,调用自行编写的函数过程的方法和调用 Visual Basic 内部函数过程(例如 Abs)的方法一样;即在表达式中写上它的名字 。
'下面的语句都调用函数 ToDec 。
Print 10 * ToDec
X = ToDec
If ToDec = 10 Then Debug.Print "Out of Range"

推荐阅读