读书人

100分征VB间接内嵌汇编指令实现一些小

发布时间: 2012-01-20 18:53:53 作者: rapoo

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,EDXend;


[解决办法]
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 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 

读书人网 >VB

热点推荐