24小时热门版块排行榜    

Znn3bq.jpeg
查看: 568  |  回复: 1
当前主题已经存档。

sdlj8051

金虫 (著名写手)

[交流] [转贴]p-code 执行(译)

John Chamberlain 在他的文章“Microsoft's P-Code Implementation”中是这样介绍的:

最初的Pascal编译器涉及特定的计算机,它的复杂性基于编译器自身。为了解决生成代码的跨平台问题,编译器产生一种伪代码(伪执行代码,与特定计算机的指令无关)“pseudo-opcode”,它被称为"Pascal-P",编译器能够输出伪指令“p-pcode”。大约10年后,Microsoft为它自己相关产品采用了这个惯用的术语"p-code" 和 "p-code 引擎"。对于“VB p-code”,可移植性“portable”不是被优先考虑的,这个前缀“p”的含义被转义为压缩“packed”,可执行程序被压缩成字节占用很小的文件。1995年sun公司的java席卷了web世界,Microsoft 作为回应,将它的 p-code 引擎转换成更性感的新名称 vb虚拟机"VB Virtual Machine",其实这并不十分恰当。无论如何,Java's 操作码opcode 对应的是抽象的cpu指令,Microsoft的p-codes 是一种抽象的编程语言和环境,它更适当的称呼应该是vb虚拟语言 "VB Virtual Language".

VB 虚拟机基础  
如是我闻,John Chamberlain 接着说,VB6 有1351 条伪指令opcodes,它维护一个寄存器指针和一个跳转表,指向那些待处理的后续伪代码,并且,vb不通过p-code进行循环操作。

举例:执行伪指令f5,将一个Long(长整型,32 位,4 个字节)变量存储. ESI 寄存器总是指向有关的伪指令,EAX 包含跳转地址的索引。



Address………..(p-code bytes)
001a56d1………3c 00 0a f5  ;f5 当前执行的伪指令
001a56d5………08 00 00 00  
001a56d9………71 78 ff 00  

当前伪指令指令结束后,将跳到下一条伪指令(71)处
Eax=000000f5 (begin)  ; 伪指令
Eax=00000071 (end)

Esi=001a56d5 (begin)  ; 伪指令序列指针
Esi=001a56da (enbd)

0FC01377 mov eax,dword ptr [esi] (1) 引出伪指令参量
0FC01379 push eax (2) 进行伪指令相应的工作
0FC0137A xor eax,eax (3) 转入下一个伪指令
0FC0137C mov al,byte ptr [esi+4]  
0FC0137F add esi,5 ; 下一个待处理的伪指令位置
0FC01382 jmp dword ptr [eax*4+0FC027CCh] 执行相关伪指令的处理控制进程

注:0FC01382 语句中的0FC027CCh 指向一个向量表

处理引擎的工作:在字节代码流中,放入一个long数据类型的常量8(好像这样的形式"F5 08 00 00 00"等待被vb处理机执行. 所有的伪代码都是基于类似的形式。

如是我闻,John Chamberlain 又继续解释上面的这个实例:
以上实例中,向量表指向0FC027CC,因此,一个伪指令(71)将跳到这个向量表的第71个入口地址71*4+0FC027CC. 在这里,第二步只是进行了一个简单的压栈操作,但是其他的伪代码可能有很复杂的执行过程。不管那些处理过程有多复杂,你不必介入具体的执行过程,只要你清楚每个伪指令对应的向量表中执行入口即可。
例如:在debugger中设置一个断点在0FC01377(参照以上实例),你就会中断在执行伪指令f5之前.  
Vb6虚拟机仅仅指定寄存器ESI,EAX作为专用寄存器,EAX总是在被调用之前清除(xor eax, eax),并且装入有关的跳转参量,在相应的伪指令处理过程中,ESI 寄存器是被保护的. 在上例中,(add esi, 5) 使得esi指向下一条伪指令,并忽略当前执行的伪指令的参数。vb应用程序的执行控制流是基于对ESI寄存器的设置. Vb6中有775 伪指令处理子程序,大概是因为1351 伪指令中有一些对应着同一个伪指令处理程序。  
John Chamberlain 提供的The opcode database(见附件)格式:
|Opcode|__|VB6虚拟机的rva|__|VBA的rva|__|参数尺寸|__|注释|
1F___________09AD_____________0A32__________2_1_2____vbaRecUniToAnsi                                                                                                                                                   
参数尺寸:
1. 参数总尺寸(bytes)
2. 参数总个数
3. 第1,2,3个参数的尺寸(bytes)
更多的信息请参照:
http://www.programmersheaven.com ... cles/john/vbvm.htm.

[ Last edited by sdlj8051 on 2006-10-6 at 12:36 ]
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

gph-rabbit

金虫 (小有名气)

学习。
2楼2006-12-29 01:16:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 sdlj8051 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 288求调剂,一志愿华南理工大学071005 +19 ioodiiij 2026-04-08 19/950 2026-04-13 13:03 by 风雨无晴
[考研] 一志愿鲁东大学071000生物学学硕初试分数276求调剂 +7 慕绝cc 2026-04-09 7/350 2026-04-13 12:01 by zhshch
[考研] 0854调剂 +10 长弓傲 2026-04-11 11/550 2026-04-13 10:38 by wp06
[考研] 化工学硕294分,求导师收留 +18 yzyzx 2026-04-12 18/900 2026-04-13 10:20 by sophia_93
[考研] 一志愿华工085600 331分 +7 天下ww 2026-04-09 7/350 2026-04-13 09:01 by lhj2009
[考研] 材料299专硕求调剂 +11 +21 2026-04-09 11/550 2026-04-13 08:57 by lhj2009
[考研] 求调剂,985材料与化工348分 +9 涵竹刘 2026-04-11 13/650 2026-04-12 22:40 by 涵竹刘
[考研] 279求调剂 +9 张番茄不炒蛋 2026-04-11 9/450 2026-04-12 22:22 by paopaotu326
[教师之家] 山东双非院校考核超级无底线,领导幸灾乐祸,教师遭殃恐 +3 qut2026 2026-04-11 7/350 2026-04-12 20:24 by qut2026
[考研] 0831生医工第一轮调剂失败求助 +12 小熊睿睿_s 2026-04-11 16/800 2026-04-12 16:28 by 钰璞
[考研] 求调剂 +18 MAX怅惘 2026-04-09 20/1000 2026-04-11 23:31 by zhen~
[考研] 277 数一104,学硕,求调剂 +21 瓶子PZ 2026-04-09 23/1150 2026-04-11 23:12 by labixiaoqiao
[考研] 材料工程日语考生求调剂 +7 0856?调剂 2026-04-10 7/350 2026-04-11 21:33 by 蓝云思雨
[考研] 269电子信息求调剂,可转专业 +11 独酌wl 2026-04-06 11/550 2026-04-11 11:12 by 逆水乘风
[考研] 工科273调剂 +6 X1999 2026-04-09 7/350 2026-04-11 10:23 by zhq0425
[考研] 考研调剂 +26 硕星赴 2026-04-09 27/1350 2026-04-10 22:24 by 猪会飞
[考研] 一志愿厦大生物学332求调剂 +10 池池池池池池 2026-04-08 10/500 2026-04-09 17:10 by 独醉梦孤城
[考研] 085400电子信息类(川大控制工程)求调剂可跨专业 求老师联系 +3 626776879 2026-04-08 3/150 2026-04-09 16:05 by 猪会飞
[考研] 327求调剂 +10 Xxjc1107. 2026-04-06 11/550 2026-04-09 01:21 by lature00
[考研] 考研调剂 +3 Wwwwwww哇 2026-04-06 3/150 2026-04-06 20:55 by lbsjt
信息提示
请填处理意见