该用户从未签到
|
转载: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
|
|