你认为你是高手的,请看看该段代码,是做什么的?(1分)

  • 主题发起人 主题发起人 wwb8081
  • 开始时间 开始时间
W

wwb8081

Unregistered / Unconfirmed
GUEST, unregistred user!
asm
PUSH ESI
MOV SI,[EDX]
OR SI,SI
JE @@default
CMP SI,0C000H
JAE @@default
PUSH EAX
MOV EAX,[EAX]
CALL GetDynaMethod
POP EAX
JE @@default
MOV ECX,ESI
POP ESI
JMP ECX

@@default:
POP ESI
MOV ECX,[EAX]
JMP DWORD PTR [ECX] + VMTOFFSET TObject.DefaultHandler
end;


你如果明白该代码用途,并有兴趣研究的,可跟我一起切磋
我的MSN:wwb8081@hotmail.com
期盼高手,结识!!!!
 
是汇编,要去再翻一下书了,都忘光了
 
把函数贴全。
 
就这么几句却是看不出功能所在(这是?GetDynaMethod)

不过思路很清晰
 
不好意思,
EAX:对象的指针
EDX:TMessage的指针
 
GetDynaMethod 函数在这,可查询。
procedure GetDynaMethod;
{ function GetDynaMethod(vmt: TClass;
selector: Smallint) : Pointer;
}
asm
{ -> EAX vmt of class }
{ SI dynamic method index }
{ <- ESI pointer to routine }
{ ZF = 0 if found }
{ trashes: EAX, ECX }

PUSH EDI
XCHG EAX,ESI
JMP @@haveVMT
@@outerLoop:
MOV ESI,[ESI]
@@haveVMT:
MOV EDI,[ESI].vmtDynamicTable
TEST EDI,EDI
JE @@parent
MOVZX ECX,word ptr [EDI]
PUSH ECX
ADD EDI,2
REPNE SCASW
JE @@found
POP ECX
@@parent:
MOV ESI,[ESI].vmtParent
TEST ESI,ESI
JNE @@outerLoop
JMP @@exit

@@found:
POP EAX
ADD EAX,EAX
SUB EAX,ECX { this will always clear the Z-flag ! }
MOV ESI,[EDI+EAX*2-4]

@@exit:
POP EDI
end;

 
又。。。。。
 
楼住的代码是消息分派的代码
procedure TObject.Dispatch(var Message);
asm
PUSH ESI
MOV SI,[EDX]
OR SI,SI
JE @@default
CMP SI,0C000H
JAE @@default
PUSH EAX
MOV EAX,[EAX]
CALL GetDynaMethod
POP EAX
JE @@default
MOV ECX,ESI
POP ESI
JMP ECX

@@default:
POP ESI
MOV ECX,[EAX]
JMP DWORD PTR [ECX] + VMTOFFSET TObject.DefaultHandler
end;
 
wr960204,看到后,和我联系。
 
有什么事情?
我的MSN:wr960204@hotmail.com
不过我现在移动,他们那里封了端口上不了MSN。
我的QQ:42088303
 
有空和你切磋,切磋!!
 
后退
顶部