menglv 发表于 2015-5-9 16:53:25

【原创】asminvb1.2.0.2可用版本,喜欢的下

本帖最后由 menglv 于 2015-5-9 16:57 编辑




绝对原创可用!取消了80行汇编的限制!其它的限制不清楚,因为没有更多的实例。
经测试,支持 include、includelib 伪指令,库文件自己装个masm即可。



指针,算术,位移运算开发包部份示例代码


指针,算术,位移运算开发包部份示例代码因这个开发包提供的函数较多,考虑演示版的功能限制,在下面贴出几个简单的函数:

Option Explicit
'_asm
#If Not IS_RELEASE Then
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
#End If
Public Function UAdd(ByVal ValueA As Long, ByVal ValueB As Long) As Long
#If Not IS_RELEASE Then
    Dim lX4 As Long
    Dim lY4 As Long
    Dim lX8 As Long
    Dim lY8 As Long
    Dim lResult As Long
    lX8 = ValueA And &H80000000
    lY8 = ValueB And &H80000000
    lX4 = ValueA And &H40000000
    lY4 = ValueB And &H40000000
    lResult = (ValueA And &H3FFFFFFF) + (ValueB And &H3FFFFFFF)
    If lX4 And lY4 Then
      lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
    ElseIf lX4 Or lY4 Then
      If lResult And &H40000000 Then
            lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
      Else
            lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
      End If
    Else
      lResult = lResult Xor lX8 Xor lY8
    End If
    UAdd = lResult
#Else
    '_asm{overall}
    '_asm   mov   eax,
    '_asm   add   eax,   ;同样,将 add 改成 sub 即成了无符号相减函数
    '_asm   ret   2*4
#End If
End Function
'/* 右移函数
Function Shr(ByVal Value As Long, ByVal Bit As Byte) As Long
#If Not IS_RELEASE Then
    Shr = Value \ (2 ^ Bit) '可另看这一点代码,运行却是非常慢的啊
#Else
   '_asm{overall}
    '_asm   mov   eax,
    '_asm   mov   cl, byte PTR
    '_asm   shr   eax,cl
    '_asm   ret   2*4         ;另看这几行代码,时间却是上面的代码上百倍的速度
#End If
End Function
'/* 左移函数
Function Shl(ByVal Value As Long, ByVal Bit As Byte) As Long
#If Not IS_RELEASE Then
    Shl = Value * (2 ^ Bit)'可另看这一点代码,运行却是非常慢的啊
#Else
    '_asm{overall}
    '_asm   mov   eax,
    '_asm   mov   cl, byte PTR
    '_asm   shl   eax,cl
    '_asm   ret   2*4         ;另看这几行代码,时间却是上面的代码上百倍的速度
#End If
End Function
'/* 四字节的内存操作函数(改变不同有参数声明,即可应用于不同类型的数据。)
Sub Assign(lPtr1 As Long, lPtr2 As Long)
#If Not IS_RELEASE Then
    CopyMemory lPtr1, lPtr2, 4
#Else
    '_asm{overall}
    '_asm   mov   eax,dword ptr
    '_asm   mov   edx,dword ptr
    '_asm   mov   ecx,dword ptr
    '_asm   mov   dword ptr ,ecx
    '_asm   ret   08H
#End If
End Sub'/* 四字节内存清零函数
Sub AssignZero(lPtr As Long)
#If Not IS_RELEASE Then
    CopyMemory lPtr, 0&, 4
#Else
    '_asm{overall}
    '_asm   mov   eax,dword ptr
    '_asm   xor   edx,edx
    '_asm   mov   dword ptr ,edx
    '_asm   ret   4
#End If
End Sub
'/******************************************************************************
'/*还有其它函数如下:本示例代码就不一一列出,其它的下载指针及位操作开发包
'/*
'/*循环左移;循环右移;位测试,位范围值,低16位值函数,高16位值函数,etc.
'/*
'/******************************************************************************

'在frm代码中调用:

Function Shl(ByVal Value As Long, ByVal Bits As Long, ByVal dfjk As Long) As Long
'_asm{overall}
'    _asm{
'         mov    eax, ;第一个参数为
'         mov    ecx, ;第二个参数为,以此类推
'         Shl    eax, cl
'         mov,eax;shl为
'         ret    5 * 4;(参数个数+2)*4
'       }

End Function
'在bas模块中调用:
Function Shr(ByVal Value As Long, ByVal Bits As Long, ByVal dfjk As Long) As Long
'_asm{overall}
'    _asm{
'         mov    eax, ;第一个参数为
'         mov    ecx, ;第二个参数为,以此类推
'         Shr   eax, cl
'         ret    3 * 4;(参数个数)*4
'       }
不过frm中的调用函数并不能直接返回到shl,这个也许asminvb的作者也不知道!
还有就是在frm中的调用会有很多垃圾的代码,所以并不提倡在frm代码中调用!


非诚勿扰 发表于 2015-5-9 18:24:06

沙发,支持大师作品

erui 发表于 2015-5-9 19:01:54

给力的软件,谢谢分享

hack0215 发表于 2015-6-6 10:02:49

给力的软件,谢谢分享

hhxxhg 发表于 2017-2-15 12:31:58

没有完整的开发包吗

x830223 发表于 2018-5-7 09:20:49

给力的软件,谢谢分享
页: [1]
查看完整版本: 【原创】asminvb1.2.0.2可用版本,喜欢的下