飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3990|回复: 5

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

[复制链接]
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

    发表于 2015-5-9 16:53:25 | 显示全部楼层 |阅读模式
    本帖最后由 menglv 于 2015-5-9 16:57 编辑




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

    asminvb1.2.0.2.rar (229.7 KB, 下载次数: 38)

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


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

    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,[esp+4]
        '_asm   add     eax,[esp+8]     ;同样,将 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,[esp+4]
        '_asm   mov     cl, byte PTR[esp+8]
        '_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,[esp+4]
        '_asm   mov     cl, byte PTR[esp+8]
        '_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 [esp+04H]
        '_asm   mov     edx,dword ptr [esp+08H]
        '_asm   mov     ecx,dword ptr [edx]
        '_asm   mov     dword ptr [eax],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 [esp+04H]
        '_asm   xor     edx,edx
        '_asm   mov     dword ptr [eax],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, [esp+8];第一个参数为[esp+8]
    '         mov    ecx, [esp+12];第二个参数为[esp+8+4],以此类推
    '         Shl    eax, cl
    '         mov  [esp+48],eax;shl为[esp+36+参数个数*4]
    '         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, [esp+4];第一个参数为[esp+4]
    '         mov    ecx, [esp+8];第二个参数为[esp+4+4],以此类推
    '         Shr   eax, cl
    '         ret    3 * 4;(参数个数)*4
    '       }
    不过frm中的调用函数并不能直接返回到shl,这个也许asminvb的作者也不知道!
    还有就是在frm中的调用会有很多垃圾的代码,所以并不提倡在frm代码中调用!


    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 2058 天

    [LV.Master]伴坛终老

    发表于 2015-5-9 18:24:06 | 显示全部楼层
    沙发,支持大师作品
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 2091 天

    [LV.Master]伴坛终老

    发表于 2015-5-9 19:01:54 | 显示全部楼层
    给力的软件,谢谢分享
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-1-21 19:20
  • 签到天数: 126 天

    [LV.7]常住居民III

    发表于 2015-6-6 10:02:49 | 显示全部楼层
    给力的软件,谢谢分享
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-4-11 14:03
  • 签到天数: 808 天

    [LV.10]以坛为家III

    发表于 2017-2-15 12:31:58 | 显示全部楼层
    没有完整的开发包吗
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-7-18 11:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2018-5-7 09:20:49 | 显示全部楼层
    给力的软件,谢谢分享
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表