反汇编_ClassCreate,jl+$03 为什么会跳到 xor edx,edx。(300分)

  • 主题发起人 主题发起人 skyjacker
  • 开始时间 开始时间
S

skyjacker

Unregistered / Unconfirmed
GUEST, unregistred user!
/*_ClassCreate src*/
function _ClassCreate(AClass: TClass
Alloc: Boolean): TObject;
asm
{ -> EAX = pointer to VMT }
{ <- EAX = pointer to instance }
PUSH EDX
PUSH ECX
PUSH EBX
TEST DL,DL
JL @@noAlloc //jl +$03 ?
CALL dword ptr [EAX].vmtNewInstance
@@noAlloc:
{$IFNDEF PC_MAPPED_EXCEPTIONS}
XOR EDX,EDX
LEA ECX,[ESP+16]
MOV EBX,FS:[EDX]
MOV [ECX].TExcFrame.next,EBX
MOV [ECX].TExcFrame.hEBP,EBP
MOV [ECX].TExcFrame.desc,offset @desc
MOV [ECX].TexcFrame.ConstructedObject,EAX { trick: remember copy to instance

}
MOV FS:[EDX],ECX
{$ENDIF}
POP EBX
POP ECX
POP EDX
RET

{$IFNDEF PC_MAPPED_EXCEPTIONS}
@desc:
JMP _HandleAnyException

{ destroy the object }

MOV EAX,[ESP+8+9*4]
MOV EAX,[EAX].TExcFrame.ConstructedObject
TEST EAX,EAX
JE @@skip
MOV ECX,[EAX]
MOV DL,$81
PUSH EAX
CALL dword ptr [ECX].vmtDestroy
POP EAX
CALL _ClassDestroy
@@skip:
{ reraise the exception }
CALL _RaiseAgain
{$ENDIF}
end;

/*运行过程中,反汇编*/

0040382B C3 ret
0040382C 52 push edx
0040382D 51 push ecx
0040382E 53 push ebx
0040382F 84D2 test dl,dl
00403831 7C03 jl +$03 //加 3 后,为什么会跳到 xor edx,edx,怎样计算的?
00403833 FF50F4 call dword ptr [eax-$0c]
00403836 31D2 xor edx,edx
00403838 8D4C2410 lea ecx,[esp+$10]
0040383C 648B1A mov ebx,fs:[edx]
0040383F 8919 mov [ecx],ebx
00403841 896908 mov [ecx+$08],ebp
00403844 C7410455384000 mov [ecx+$04],$00403855
0040384B 89410C mov [ecx+$0c],eax
0040384E 64890A mov fs:[edx],ecx
00403851 5B pop ebx
00403852 59 pop ecx
00403853 5A pop edx
00403854 C3 ret
00403855 E94E010000 jmp @HandleAnyException
0040385A 8B44242C mov eax,[esp+$2c]
0040385E 8B400C mov eax,[eax+$0c]
00403861 85C0 test eax,eax
00403863 740E jz +$0e
00403865 8B08 mov ecx,[eax]
00403867 B281 mov dl,$81
00403869 50 push eax
0040386A FF51FC call dword ptr [ecx-$04]
0040386D 58 pop eax
0040386E E809000000 call @ClassDestroy


jl +$03 段 在计算机中的字节实际如下排列:

00403831 7C
00403832 03
jl +$03
00403833 FF
00403834 50
00403835 F4
call dword ptr [eax-$0c]
00403836 31
00403837 D2
xor edx,edx
00403838 85

jl+$03 为什么会跳到 xor edx,edx,怎样计算的,起始地址是多少呢?
 
会不会真的给分啊,这么简单的问题:〕
看一下opcode相关资料吧。
00403831 7C03 jl +$03
00403833 FF50F4 call dword ptr [eax-$0c]
00403836 31D2 xor edx,edx
jl地址为403831,+3意味着跳到jl语句后3个字节处,就是00403833 + 3 = 00403836处
 
&quot;jl地址为403831,+3意味着跳到jl语句后3个字节处,就是00403833 + 3 = 00403836处
&quot;
不理解阿。

按你的意思,则 JL+$0 就跳到了 00403833 .
 
接受答案了.
 
后退
顶部