能力值:
( LV13,RANK:1760 )
|
-
-
2 楼
,77张图片传的偶眼冒金星... ,要是坛子的编辑功能能像Discuz!论坛那样可以节省多少时间呀...  
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
楼主辛苦了!
|
能力值:
( LV12,RANK:340 )
|
-
-
4 楼
占位~~~~
lz辛苦了
|
能力值:
( LV12,RANK:340 )
|
-
-
5 楼
看了下lz的译文,很详细,收下了,但是有几个错误要指出。
fb → Lead0 比较两个字符串 30 → EqStr 比较两个字符串(与Lead0配合使用) 2f → FFree1Str 释放内存空间 1a → FFree1Ad 释放内存空间 0f → VCallAd 通过虚拟机运行操作码 1c → BranchF 条件跳转指令,如果栈顶的值为false则跳转(相当于汇编指令JNE/JNZ) 1d → BranchT 条件跳转指令,如果栈顶的值为true则跳转(相当于汇编指令JE/JZ) 1e → Branch 无条件跳转(嘿嘿,相当于汇编指令JMP) fc → Lead1 终止程序
vb p-code指令中Lead0、Lead1、Lead2、Lead3、Lead4是没有意义的,具体意义要看后一个操作码。
VB 的p-code是按byte取操作码执行的,那样的话就只有256中操作符可供使用了。
但是p-code有1000多条指令,256条肯定是不够的,所以就出现Lead(引导)指令。
这里觉得叫Lead指令为扩展指令比较贴切。
首先简单说明一下p-code指令格式:
<标准指令前缀> [扩展指令前缀] [定参] [变参]
定参: 固定参数
变参: 可变参数
当vb虚拟机(vbvm)开始取指令时,是按照指令前缀来进行操作的。
标准指令前缀为1个字节。当指令前缀范围在0xFB~0xFF(Lead0=0xFB,Lead1=0xFC,Lead2=0xFD,Lead3=0xFE,Lead4=0xFF)
范围内时,存在扩展指令前缀(1 Byte),取得了指令前缀仅仅是知道了定参的格式。
变参是根据定参来定义的。参考Semi VB Decompiler 的源码,有部分指令的指令大小被设置成-1。
这种指令就存在变参。对于有变参的指令来说,其定参是固定的,为1个WORD。
这个WORD描述的是紧随其后的变参的大小(长度),是以字节为单位的。但是正常情况下该定参永远不会是奇数。
因为变参实际上是一个WORD数组,vbvm一般是释放数组所表示的内存指针。
另外在MSVBVM60.dll中,有6张跳转表。
分别是:
std [256]
lead0 [256]
lead1 [256]
lead2 [256]
lead3 [256]
lead4 [71]
std就是标准指令前缀。当标准指令前缀范围在0xFB~0xFF范围时,取扩展指令前缀。并跳转到扩展指令跳转表里。
|
能力值:
( LV13,RANK:1760 )
|
-
-
6 楼
感谢bxc兄的指正,文中已更正... bxc兄对P-CODE很有研究啊...
|
能力值:
( LV12,RANK:340 )
|
-
-
7 楼
没有啦,就是最近在搞p-code相关的东西,把VB的源码翻译成C++的,快恶心吐了
|
能力值:
( LV13,RANK:1760 )
|
-
-
8 楼
 ,好犀利的赶脚...
|
能力值:
( LV12,RANK:340 )
|
-
-
9 楼
没多犀利  搞了快半年了,还没整出来。。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
楼主辛苦了,七十七张图换了可能是一群后面的感谢
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
楼主幸苦
不明觉厉
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
77张图片,辛苦了
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
楼主厉害啊.老菜鸟来支持
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
 学习了。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
我潜了好多年了,看了安哥的教程 不得不说,安哥真是为我等菜鸟提供了很好的教材,在这里 真心谢谢安哥。
|
能力值:
( LV13,RANK:1760 )
|
-
-
16 楼
都是从小鸟过来的,共同进步挺好...
|
能力值:
( LV5,RANK:70 )
|
-
-
17 楼
谢了,LZ有劳了。
|
|
|