当前位置:编程学习 > VB >>

能在VB代码里加上汇编吗?

要可以运行的~ 举个小小的例子
答案:获取CPU信息的一个小例子,用机器码写:

窗体代码:

Private Sub Command1_Click()
  MsgBox GetCpuName() & " CPU"
End Sub

 

模块代码:

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 Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private x As Long

Public Function GetCpuName() As String
 
  Dim MachineCode(0 To 35) As Byte
  Dim VarAddr               As Long
  Dim FunctAddr             As Long
  Dim EAX                   As Long
  Dim CPUName(1 To 12)      As Byte
 
 
  '汇编指令数组,每一句右侧的指令就是相关的汇编指令
 
    MachineCode(0) = &H55    'push ebp
    MachineCode(1) = &H8B    'move ebp,esp
    MachineCode(2) = &HEC
    MachineCode(3) = &H57    'push edi
    MachineCode(4) = &H52    'push edx
    MachineCode(5) = &H51    'push ecx
    MachineCode(6) = &H53    'push ebx
    MachineCode(7) = &H8B    'move eax,dword ptr [ebp+8]
    MachineCode(8) = &H45
    MachineCode(9) = &H8
    MachineCode(10) = &HF    'cpuid
    MachineCode(11) = &HA2
    MachineCode(12) = &H8B   'mov edi,dword ptr [ebp+12]
    MachineCode(13) = &H7D
    MachineCode(14) = &HC
    MachineCode(15) = &H89   'move dword ptr [edi],ebx
    MachineCode(16) = &H1F
    MachineCode(17) = &H8B   'mov edi,dword ptr [ebp+16]
    MachineCode(18) = &H7D
    MachineCode(19) = &H10
    MachineCode(20) = &H89   'move dword ptr [edi],ecx
    MachineCode(21) = &HF
    MachineCode(22) = &H8B   'mov edi,dword ptr [ebp+20]
    MachineCode(23) = &H7D
    MachineCode(24) = &H14
    MachineCode(25) = &H89   'move dword ptr [edi],edx
    MachineCode(26) = &H17
    MachineCode(27) = &H58   'pop ebx
    MachineCode(28) = &H59   'pop ecx
    MachineCode(29) = &H5A   'pop edx
    MachineCode(30) = &H55   'pop edi
    MachineCode(31) = &HC9   'leave
    MachineCode(32) = &HC2   'ret 16   我试过从0执行到24,但会产生堆栈错误。
    MachineCode(33) = &H10
    MachineCode(34) = &H0
 
    EAX = 0
 
    '取得指令地址
    VarAddr = VarPtr(MachineCode(0))
 
    '取得地址
    FunctAddr = GetAddress(AddressOf Dummy)
 
    '把指令从内存中调出
    CopyMemory ByVal FunctAddr, ByVal VarAddr, 35 '35 字节的指令符

    On Error Resume Next
    CallWindowProc FunctAddr, EAX, VarPtr(CPUName(1)), VarPtr(CPUName(9)), VarPtr(CPUName(5))
    On Error GoTo 0
 
    GetCpuName = StrConv(CPUName(), vbUnicode)
 
End Function

Private Function GetAddress(Address As Long) As Long
    GetAddress = Address
End Function

Private Sub Dummy()

'替换相关的指令字符

    x = 0
    x = 1
    x = 2
    x = 3
    x = 4
    x = 5
    x = 6
    x = 7
    x = 8
    x = 9
    x = 10
    x = 0
    x = 1
    x = 2
    x = 3
    x = 4
    x = 5
    x = 6
    x = 7
    x = 8
    x = 9
    x = 10
End Sub

上一个:VB能够连接access数据库吗?如何连接?
下一个:VB中程序错误的捕获以及处理方法

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,