100分征VB间接内嵌汇编指令实现一些小功能的方案
需要封装成函数的一般方案,好像大约是用字节数组放对应汇编的二进制数组,再搞些copymemory啥的控制好输入输出啥的.
最简单和实用的(用于性能分析)的是这个求"CPU时间戳"的指令
inline unsigned __int64 GetCycleCount()
{
__asm RDTSC
}
或
inline unsigned __int64 GetCycleCount()
{
__asm _emit 0x0F
__asm _emit 0x31
}
复杂一点的比如这样一段pascal里的求字符串长度的汇编
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,EDXend;
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 LongPrivate 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 '要嵌入机器码,首先需要用工具软件将汇编指令转成机器码,如OllyICEEnd Sub