100分征VB间接内嵌汇编指令实现一些小功能的方案解决思路
100分征VB间接内嵌汇编指令实现一些小功能的方案
需要封装成函数的一般方案,好像大约是用字节数组放对应汇编的二进制数组,再搞些copymemory啥的控制好输入输出啥的.
最简单和实用的(用于性能分析)的是这个求"CPU时间戳"的指令
inline unsigned __int64 GetCycleCount()
{
__asm RDTSC
}
或
inline unsigned __int64 GetCycleCount()
{
__asm _emit 0x0F
__asm _emit 0x31
}
复杂一点的比如这样一段pascal里的求字符串长度的汇编
------解决方案--------------------
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语法块内嵌汇编的功能.
也不贵,好象二三十块钱吧.
要是用得着的话倒还可以买一个:)
------解决方案--------------------
需要封装成函数的一般方案,好像大约是用字节数组放对应汇编的二进制数组,再搞些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