100分征VB间接内嵌汇编指令实现一些小功能的方案解决思路

100分征VB间接内嵌汇编指令实现一些小功能的方案
需要封装成函数的一般方案,好像大约是用字节数组放对应汇编的二进制数组,再搞些copymemory啥的控制好输入输出啥的.

最简单和实用的(用于性能分析)的是这个求"CPU时间戳"的指令
inline unsigned __int64 GetCycleCount()
{
 __asm RDTSC
}

inline unsigned __int64 GetCycleCount()
{
 __asm _emit 0x0F
 __asm _emit 0x31
}

复杂一点的比如这样一段pascal里的求字符串长度的汇编
Delphi(Pascal) code
function StrLen(const Str: PChar): Cardinal; assembler;
asm
        MOV     EDX,EDI
        MOV     EDI,EAX
        MOV     ECX,0FFFFFFFFH
        XOR     AL,AL
        REPNE   SCASB
        MOV     EAX,0FFFFFFFEH
        SUB     EAX,ECX
        MOV     EDI,EDX
end;



------解决方案--------------------
http://topic.csdn.net/u/20080529/00/573e70c3-e6c5-43be-86da-8654e8fb841b.html?49566http://blog.csdn.net/Modest/archive/2008/06/08/2523187.aspx
------解决方案--------------------
个人觉得这么做没有意思。

懂汇编,甚至Thunk的人难道不能用C/C++写么?

再说,thunk的代码要注意在 DEP/NX 处理器/操作系统上的兼容性。
------解决方案--------------------
这个.....之前我收藏过一个汇编类,扩展比较方便,你可以参考一下:

收藏一个汇编类,可以方便地自行扩展(VB6.0)

另外,阿国哥曾经写过一个叫AsmInVB的IDE插件,可实现类似C语言中_asm语法块内嵌汇编的功能.

也不贵,好象二三十块钱吧.

要是用得着的话倒还可以买一个:)
------解决方案--------------------
VB code

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 Command1_Click()
Dim Asm(12) As Byte
    Asm(0) = &H58 'pop eax
    Asm(1) = &H59 'pop ecx
    Asm(2) = &H59 'pop ecx
    Asm(3) = &H59 'pop ecx
    Asm(4) = &H59 'pop ecx------->VarPtr(Asm(0))输出参数
    Asm(5) = &H50 'push eax------>下一条指令地址入栈
    
    '==============要嵌入的代码
    
    Asm(6) = &HC6 '-
    Asm(7) = &H1  ' > mov byte ptr[ecx],0 即asm(0)=1
    Asm(8) = &H1  '-
    
    Asm(9) = &HC0  '-
    Asm(10) = &H21 ' > sal byte ptr[ecx],3 即asm(0)左移3位
    Asm(11) = &H3  '-
    
    '==============要嵌入的代码

    Asm(12) = &HC3 'ret------>下一条指令地址出栈
    
    
    
    CallWindowProc VarPtr(Asm(0)), 0, 0, 0, VarPtr(Asm(0))
       'VarPtr(Asm(0)输出参数
       '第一个压入堆栈,最后一个弹出
       '参数入栈顺序为从右到左
    
    MsgBox Asm(0) '输出8
    
    '要嵌入机器码,首先需要用工具软件将汇编指令转成机器码,如OllyICE


End Sub