下沙论坛

 找回密码
 注册论坛(EC通行证)

用新浪微博连接

一步搞定

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 3508|回复: 3
打印 上一主题 下一主题

请问VB调用我汇编写的函数

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-2-7 15:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了几个函数,VB调用后会出错,我自己汇编写的则不会
8 d0 o5 N. |! c) a9 K我是恢复了ESI,EDI寄存器(在WinAsm32附带的一个帮助中说要恢复,EA/B/C/DX则没有要求),老是出错(全部恢复当然就没错了).不知道他还有什么要求,知道的告诉小弟我啊!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩 转发到微博

该用户从未签到

2
发表于 2004-2-7 19:21:00 | 只看该作者
你用DEBUG程序跟踪一下不就知道原因了么; J+ [7 j1 F7 ?- s
既然全部恢复不出错了,就用pusha/popa好了,省事。7 [: z: N4 }: r( M; h5 T
对于VC程序,ECX常用于函数间传递this指针的,VB就不知道了

该用户从未签到

3
 楼主| 发表于 2004-2-8 19:42:00 | 只看该作者
谢谢呀!

该用户从未签到

4
发表于 2004-3-19 17:50:00 | 只看该作者
转载:1 J8 f. V- t& y! f# `, u
来教你如何在vb里嵌入汇编!+ H6 o4 j: w* |, Z* E6 j
作者: wl3000wl 
& T: |) F. z; g+ {  P2 V" r: W本贴绝对值得你珍藏.
9 P8 h/ _! o. c# m  f下面的例子完全用VB进行ASM编程的示例,本例获得CPU ID.1 H" v% i3 b# ~4 z5 a
工程文件分为一个form1.frm 和一个模块module1.bas, z1 t" F+ X0 n8 {
----------------------form1.frm的源文件---------------------6 ^& W" n# q+ f- N) G7 {; D/ o
VERSION 5.00+ P1 D0 ^2 I8 q2 h
Begin VB.Form Form1
( S6 b0 a  f  m+ U# r0 Y1 W   Caption         =   "Form1"
0 b! [8 D4 v+ n6 @6 L0 B0 B   ClientHeight    =   1965- l% a& l  I1 T* M2 H( r
   ClientLeft      =   60) [- ]- e( |( ~9 M
   ClientTop       =   345, C# K1 C9 m7 X. X4 y8 N1 B  z7 J8 a
   ClientWidth     =   3105
* V/ P1 s$ a2 C6 r/ g   LinkTopic       =   "Form1"
" W& e2 p8 @# E& p. b   ScaleHeight     =   1965
4 @9 ~$ r, ~, f1 L; h0 S1 f   ScaleWidth      =   3105
! {( T" n" }; J  F6 F   StartUpPosition =   2  'Bildschirmmitte
- v( t# F3 W. v, ^8 z! {   Begin VB.CommandButton Command1 + V4 P; S, @, ^- d+ T* y# |
      Caption         =   "Get CPU Name"
- X( y3 Q0 n( e6 Y. k, @& n      Height          =   4952 M0 }4 i5 p2 ?/ \
      Left            =   840; h+ x* u; b/ f' O
      TabIndex        =   06 j/ K9 z% u( B& A( {
      Top             =   315& [( |; Z" d& F. p& |* m% u" [
      Width           =   1425, H: n+ O4 \" L& F' \/ j2 D
   End. |0 ?& P4 S* f. ~1 Z
   Begin VB.Label Label2
9 [' a% C0 P- J( b. D0 b6 E  I      Alignment       =   2  'Zentriert2 D, Y1 r) O* H2 Y/ m
      AutoSize        =   -1  'True
/ f1 h* Z6 A0 }0 v      BeginProperty Font
* |* N, v# S- G) q! e4 E         Name            =   "MS Sans Serif"  J  ~7 z$ W- K  T& C
         Size            =   9.757 _. B6 Q. b8 G3 z2 w
         Charset         =   0( Z5 Q$ K5 c0 v1 {) B+ t
         Weight          =   4004 S( q. ^( S* O, D$ o
         Underline       =   0   'False- h& t$ l8 Z; R: h( W1 W
         Italic          =   0   'False
* s1 P* l2 R$ x' B$ a% r         Strikethrough   =   0   'False
* G* a1 F# U& l; S$ S: i      EndProperty4 b' L+ [1 Z/ ^* ~1 L$ V
      Height          =   240/ ]& e- j2 ?( D; F3 H# X9 s" p, {
      Left            =   1515% F9 r# [9 p0 U+ Y! N, A0 `  c
      TabIndex        =   2
  I% Y: E: E$ y# k; i: m3 _8 Y      Top             =   10653 k/ c! z1 L& t
      Width           =   60; b: j7 h9 L$ m
   End0 v4 m/ c0 U# R& a# H$ w1 z
   Begin VB.Label Label1
* p3 S8 o# ?8 s/ N8 P4 e      Alignment       =   2  'Zentriert
9 r2 S+ r+ H2 G5 m7 A& Q( x      AutoSize        =   -1  'True) w8 @/ h* y; _
      BeginProperty Font
! [  \3 `! G! d. ~$ {2 a9 w8 B         Name            =   "Arial"# r2 d# @0 E. W7 W8 u6 T
         Size            =   127 j2 l; ?+ I! M- l, H
         Charset         =   0
1 e. Y2 [) e- @         Weight          =   700
' F( Q& r( Z' K9 p9 I8 S         Underline       =   0   'False
8 T9 S5 q) t$ W# A3 q/ i0 s         Italic          =   0   'False, Z  l9 z0 _" e6 Z3 T; a
         Strikethrough   =   0   'False: e" {6 p6 S( K
      EndProperty. @( H  f  \( \2 s
      Height          =   285' \: z: f' W  _8 z9 ^- q
      Left            =   15159 r6 d$ C! A) S
      TabIndex        =   11 T3 \/ E) N$ q% ^) L
      Top             =   13507 ]: T+ V  ~- |
      Width           =   75* V- b6 D- q2 t! x$ K
   End
; t( b3 h, q; s6 EEnd% c; f% ?* o" I, N8 D, p3 G
Attribute VB_Name = "Form1"2 N( x5 s3 ~0 ]
Attribute VB_GlobalNameSpace = False
  E& h7 _  i0 r1 ^Attribute VB_Creatable = False0 o& ?; s+ w1 c7 F1 m5 D& g6 g
Attribute VB_PredeclaredId = True+ L5 F: b4 J8 S# n( f4 T" \
Attribute VB_Exposed = False7 E$ F* K' g0 q" y5 s0 B. l
Option Explicit2 Y2 d; k- U8 ~- y: h4 L- _' P

& i9 _) p% j) S8 z8 _Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)
# E8 x& g; I/ G, K! z! p$ @
: Z" Y/ e. r3 w2 x8 z+ X    Label1 = ""
2 I: S! @/ {) k( x. V    Label2 = ""& E: p: A: Z, B0 J" k

- `/ {# g3 S+ b4 y" c5 p4 X! {/ eEnd Sub6 q& x. ~. X/ m) J: n! V7 f

9 j& N  p' k# R. m$ jPrivate Sub Command1_Click()  Y0 r6 \. x& u5 a0 a  S3 E6 z- @
   
4 D6 K, K( _) _" W  |) b/ h    Label1 = GetCpuName() & " CPU"
1 e: j  T: B* O7 F; U  ]    Label2 = "You have a" & IIf(InStr("AEIOU", Left$(Label1, 1)), "n", "")
. ]6 f1 N  M7 L" u& `8 T( n- N5 F6 c" P! ^8 ?
End Sub. t6 L& z/ v0 I8 x8 K
------------------------------end---------------------------------! ^! L' c) t, y( a3 A6 @; R% Z# y2 w
. ]& M) J/ `9 C: Q* j) K

. I) w. X. H7 ~9 i- n, u9 b: L
4 ]  w7 l5 z1 l8 a4 Y$ s
% ~' h' ], k4 c- D+ f
0 }! I0 }1 Y5 `, b, Z下面是modu1e.bas的源代码0 F; e# ]* t9 z6 p

- E( T+ C$ g5 S----------------------module1.bas的源文件--------------------------) X/ q' D. l" X* B2 C# h
Option Explicit
# @- f% F6 K  j' z& @'+ ?# q) @5 R9 O; {5 G; W0 r# g
'This shows how to incorporate machine code into VB3 s: Z5 j* }' `  e4 E
'''''''''''''''''''''''''''''''''''''''''''''''''''( H7 i+ r3 l& i' h8 t4 d* G
'The example fills the array with a few machine instructions and then copies
( |. k% E: _: ~2 d6 V8 u'them to a procedure address. The modified procedure is then called thru7 `0 \; @  C: W1 c$ g6 o2 d
'CallWindowProc. The result of this specific machine code is your CPU Vendor Name.
0 R& O; S) y( p, ]4 |. M& ^4 }& {) W'2 Z+ N, ^) \+ {2 p" U3 }9 ~8 _
'##########################################################################) l# o/ B0 S( ]. I+ I
'Apparently it gets a Stack Pointer Error, but I don't know why; if anybody
$ s6 A2 Z& ?! f! A" _& D3 E3 |'can fix that please let me know...                          UMGEDV@AOL.COM5 f, [- d5 T& `: F7 e
'The Error is not present in the native compiled version; so I think it got1 _; l' a: ^0 U6 Z  C! o% K  W
'something to do with the P-Code Calling Convention (strange though)...
) }& |0 }8 D$ u! z2 m'##########################################################################
" J1 L5 `7 {' z( v8 _6 K: ['. f: q/ Q: C/ E( f
'Sub Dummy serves to reserve some space to copy the machine instructions into.# f; p) j, f: M1 a0 y6 A
'
. j7 H, r' m# |/ a9 ['
% e8 z) j) @- ^' [0 b5 Q# w'Tested on Intel and AMD CPU's (uncompiled and compiled)$ y' T5 R  `: K9 B
'# C2 _9 x2 |/ p% E. @* t8 \. l
'6 N  a; u6 \2 R; \: o
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( X* h: Z5 B; V  U; h
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
  I( s( ?' G3 R. [Private x As Long
! _$ w" I8 Y& D, \3 r! v3 h, `& L% W* a2 q! ]7 e
Public Function GetCpuName() As String0 v( T5 x: d/ g) L
  0 `8 l, A; r0 e& i* a
  Dim MachineCode(0 To 35)  As Byte2 i" X; _* n; A& f$ O7 L$ ^; f
  Dim VarAddr               As Long
: Y( d! G) U3 @/ U; c  Dim FunctAddr             As Long- a/ R" W1 `' `7 D" \
  Dim EAX                   As Long
$ @8 L7 ~' [3 G' D% t/ |  Dim CPUName(1 To 12)      As Byte: U2 M' X" [& i9 q8 T  H
  
* O3 i& b( Q# \# Q  'set up machine code
6 t$ w  W& t: z2 \   
; D+ L% n  H' U5 f( O( v    MachineCode(0) = &H55    'push ebp1 f$ g5 S0 l+ J" p& |8 v
    0 V+ E9 o. L9 w8 t8 }3 k
    MachineCode(1) = &H8B    'move ebp,esp
( `  n9 F& D# Q! x/ h0 |    MachineCode(2) = &HEC
% g# F. k' F: F2 e* l' H    $ B& b# T  M/ T% D7 G9 M
    MachineCode(3) = &H57    'push edi4 K, G/ ~% I. k% B9 b: t3 i
   
+ h; ^; w! w* B8 ?( }+ Q, S5 n    MachineCode(4) = &H52    'push edx5 x1 p7 L! G/ D  W& }1 \( o/ P: k
    . y: Q7 E$ ~, s, N6 S" f
    MachineCode(5) = &H51    'push ecx
  a5 v* H6 V: O% b, |   
1 Z. c; \* }8 f, z    MachineCode(6) = &H53    'push ebx
' x" {7 d: f9 ~3 P. S+ X' @    5 F* M8 H$ \) \. y% N
    MachineCode(7) = &H8B    'move eax,dword ptr [ebp+8]
" E/ y1 Q. G' ]    MachineCode(8) = &H45
) F! v# J! `* e4 B$ F! `9 z    MachineCode(9) = &H81 H' |! K- `8 h" u
      l5 G( ~- d" e4 L5 R
    MachineCode(10) = &HF    'cpuid
1 B- k# m- _# ~) q' w! Z    MachineCode(11) = &HA25 |3 O7 P2 N1 x1 W, F+ n
   
& P! r) L& k1 {3 t2 v0 h  r' `    MachineCode(12) = &H8B   'mov edi,dword ptr [ebp+12]. s: X6 \$ E8 ]% I
    MachineCode(13) = &H7D) ~7 N# S  ^4 ]! G1 U" j
    MachineCode(14) = &HC5 G& K9 x9 v6 q; w+ w. {: S  P
    / V4 s3 a  L$ I: v7 J5 \; J
    MachineCode(15) = &H89   'move dword ptr [edi],ebx1 n  s  G9 j$ Y' Z7 j& p
    MachineCode(16) = &H1F
) F( r8 @7 T0 @/ k) m! l    " \& j& O5 [6 D' g' z6 K$ ?8 M# M
    MachineCode(17) = &H8B   'mov edi,dword ptr [ebp+16]3 |5 R8 i" ?" z7 W
    MachineCode(18) = &H7D4 \- k5 F; ~3 V0 [
    MachineCode(19) = &H10
( L7 K0 m( J! \/ T: E( W* Y! g2 i5 f   
  ^8 ?2 H/ Q- U8 V; z) w    MachineCode(20) = &H89   'move dword ptr [edi],ecx
" Z* a2 U% a* S2 E& {- G    MachineCode(21) = &HF
' |; B: w0 b0 g# ^* V0 c    2 |: P( _* R1 k: J3 X
    MachineCode(22) = &H8B   'mov edi,dword ptr [ebp+20]
3 r* n* M: G+ L+ a    MachineCode(23) = &H7D5 O  B6 B. q( \9 L" O9 z* V" A. Q
    MachineCode(24) = &H14
8 Q  X7 q: c( H: z" i2 G4 `. n+ O( b   
4 R% g* _* L# z; R7 [/ k! M. r0 c    MachineCode(25) = &H89   'move dword ptr [edi],edx
# `, {7 v" H1 g' q2 O    MachineCode(26) = &H17
$ n" N& s# k; ?4 I   
1 r6 k' w& E: K) H# z; a# j    MachineCode(27) = &H58   'pop ebx+ X5 W) U5 U6 e. w5 _
2 [) P3 I6 b5 ]& {9 u
    MachineCode(28) = &H59   'pop ecx
3 Q( s' k8 t  ?4 I5 W
: _3 _! n3 Q& a4 F; k    MachineCode(29) = &H5A   'pop edx. I+ Y& @1 f3 O2 Y: X+ ~

: ~2 B, r5 E+ d! m    MachineCode(30) = &H55   'pop edi0 E7 O4 }6 l+ B* b0 h: k
   
5 w0 @0 K9 u* \8 L- C    MachineCode(31) = &HC9   'leave
% J, o) M2 H& n3 I4 b
9 q; [9 o1 T/ k    MachineCode(32) = &HC2   'ret 16     I tried everything from 0 to 24
. i9 M& c8 D9 a    MachineCode(33) = &H10   '           but all produce the stack error
! X1 W2 g4 l1 M: l/ R" c! j9 O9 l    MachineCode(34) = &H0
# K2 G' [. m; U$ v   
% U0 C- R% ?8 C    'tell cpuid what we want
: W9 g; @, t" s* J4 ^    EAX = 0
. k+ ^/ f3 d. \& m- E   
4 s0 L# e6 |( m+ J, q  H' z* P/ ^) g    'get address of Machine Code
( {6 w9 \" P2 X' g" D    VarAddr = VarPtr(MachineCode(0))
% T# n: p) K' ^! \   
+ |* B3 x* G* n3 ]) _: _    'get address of Sub Dummy
0 y" ]- s4 h# J4 e( {    FunctAddr = GetAddress(AddressOf Dummy)% O, `( t5 P; O! v+ k( |5 k5 [
    / m5 d& c' T& E' v: ]
    'copy the Machine Code to where it can be called
: x  V" ?2 J. g1 g+ O/ i# r* E    CopyMemory ByVal FunctAddr, ByVal VarAddr, 35 '35 bytes machine code
7 p2 o% p) f4 B/ ~5 p5 D    " F, [+ ]" T6 f( s: `, Z: `
    'call it1 s/ w$ e: \& Y6 q: s! c
    On Error Resume Next 'apparently it gets a stack pointer error when in P-Code but i dont know why
( g; p# R" k* U* i8 e6 U/ s      CallWindowProc FunctAddr, EAX, VarPtr(CPUName(1)), VarPtr(CPUName(9)), VarPtr(CPUName(5))
- L7 U3 H; }' e6 K1 X; R  F, _      'Debug.Print Err; Err.Description/ N3 m, q. D  |, H) Z
      'MsgBox Err & Err.Description
, N- t! t& U( l1 U    On Error GoTo 0
' Z+ H+ c0 k0 M   
- M8 K5 Q$ X' `    GetCpuName = StrConv(CPUName(), vbUnicode) 'UnicodeName* s# D/ |# {6 V7 a+ H. a
   
# L3 e. u! ]4 o; |  t: GEnd Function
0 f8 t0 C# v4 w! p- i# G3 c
( h0 p9 J* l" ePrivate Function GetAddress(Address As Long) As Long$ ?$ \' @0 q1 j7 T* N5 y
4 |7 h( a/ H- a- v4 i
    GetAddress = Address+ ^, H3 e4 `+ _9 r2 @
6 O+ S5 r$ r7 p( r/ I
End Function7 c+ g& m, J4 W, _& X

( H( E1 j' {! G  h, a) M0 Y4 mPrivate Sub Dummy()8 N: m+ t2 k8 S# p! q# \

1 @1 I! |/ `  T  T  'the code below just reserves some space to copy the machine code into4 }. Q2 t7 J- i8 a% m, s- |
  'it is never executed
0 r' `. i7 P+ Q3 r/ |/ T& Y8 Y% ^4 O
    x = 0
4 [! |/ A! Z2 R$ |/ [* M    x = 1
7 q  i# b) Y% n% g' o    x = 2
! l( y6 I8 _- k+ O1 M+ C    x = 3- Q4 F3 X; Q5 x+ s& _; Z) y0 I
    x = 4: q: @) k( m: D9 [% j% q  T7 H
    x = 5
# Z, e. i. L( m, H& |    x = 67 o. [8 ~$ E; Y
    x = 7
2 s7 R- I% A$ B0 v; s    x = 8& o# T6 s/ p0 C% v; q0 m) N  z
    x = 9, W3 s* l/ h+ d
    x = 103 I* N! y1 l4 h3 }" b" m( t- u2 F
    x = 0
% E/ y3 p' z- I. y9 o% _3 Z    x = 1
% v/ ~! D8 n2 W; z! l* q  H    x = 2- J9 I( W6 H" {& r6 |
    x = 3
) h" n' @7 h5 C/ e    x = 4
) u0 O' o# ~& X    x = 53 q7 ]. B* S  u1 {  o4 C9 @; M' e
    x = 6( B% U1 t. c. {2 ?. r7 h6 y
    x = 79 H* Z# Z1 C# s0 A/ z; b
    x = 8
3 H. t; V# n" X, b0 M# S" r    x = 9
: f+ i7 v" K$ U% t# F: k( T; o    x = 108 `& _# Y7 K- Y* i$ n* v1 @5 t
   
: b, ]3 T/ M6 ?; v: D# P  ]) |8 v% vEnd Sub
/ ?& e. @' U/ C3 |. I------------------------------end--------------------------------------
& F2 e  Y* w% c' Q
% i. f+ T" I3 E
+ g2 ?, B. S* M0 D0 P) q3 J  @9 \+ x& F$ J/ w$ w+ e: d3 x  I

本版积分规则

关闭

下沙大学生网推荐上一条 /1 下一条

快速回复 返回顶部 返回列表