by sssooosss » 2014年7月24日(木) 13:27
現在AB4でアセンブラを自作しています。
そこで、コチラのサイトに載っていたマシン語のSWAPをDOSアセンブラで逆アセンブルしたらこうなりました。
まったく意味がわかりません。なぜこうなるのでしょうか?私はZ80を少しかじった程度です。
どなたか、ご親切な方、よろしくお願いいたします。
PUSH ebp
MOV ebp,esp
MOV eax,[ebp+&h8]
MOV ecx,[ebx+si]
MOV [di+&hFC],ecx
MOV edx,[di+&h8]
MOV eax,[ebp+&hC]
MOV ecx,[ebx+si]
MOV [ebp+si],ecx
MOV edx,[di+&hC]
MOV eax,[ebp+&hFC]
MOV [ebp+si],eax
MOV esp,ebp
POP ebp
RET 8
--------------------------------------
呼び出しの全コード
Function SetAsm(Asm As *Byte, Size As Long) As VoidPtr
SetAsm=VirtualAlloc(NULL, Size, MEM_COMMIT,PAGE_EXECUTE_READWRITE)
memcpy(SetAsm,Asm,Size)
EndFunction
Sub FreeAsm(Func As VoidPtr)
VirtualFree(Func, 0, MEM_DECOMMIT OR MEM_RELEASE)
EndSub
#N88BASIC
Dim Asm[ELM(00000035)]=[&H55, 'PUSH ebp
&H8B,&hEC, 'MOV ebp,esp
&H8B,&h45,&h8, 'MOV eax,[ebp
&H8B,&H08, 'MOV ecx,[ebx+si]
&H89,&h4d,&hFC, 'MOV [di,ecx
&H8B,&h55,&h8, 'MOV edx,[di
&H8B,&h45,&hC, 'MOV eax,[ebp
&H8B,&H08, 'MOV ecx,[ebx+si]
&H89,&h0A, 'MOV [ebp+si],ecx
&H8B,&h55,&hC, 'MOV edx,[di
&H8B,&h45,&hFC, 'MOV eax,[ebp
&H89,&h02, 'MOV [ebp+si],eax
&H8B,&hE5, 'MOV esp,ebp
&H5D, 'POP ebp
&HC2,8, 'RET 8
&h00] As Byte
Dim Swap3 As *Sub(p0 As *Long,p1 As *Long)'プロトタイプ宣言
Swap3 = SetAsm(Asm, ELM(35))
Dim a As Long, b As Long
a=666:b=893
Print a;b
Swap3(VarPtr(a),VarPtr(b))
Print a;b
FreeAsm(Swap3)
現在AB4でアセンブラを自作しています。
そこで、コチラのサイトに載っていたマシン語のSWAPをDOSアセンブラで逆アセンブルしたらこうなりました。
まったく意味がわかりません。なぜこうなるのでしょうか?私はZ80を少しかじった程度です。
どなたか、ご親切な方、よろしくお願いいたします。
PUSH ebp
MOV ebp,esp
MOV eax,[ebp+&h8]
MOV ecx,[ebx+si]
MOV [di+&hFC],ecx
MOV edx,[di+&h8]
MOV eax,[ebp+&hC]
MOV ecx,[ebx+si]
MOV [ebp+si],ecx
MOV edx,[di+&hC]
MOV eax,[ebp+&hFC]
MOV [ebp+si],eax
MOV esp,ebp
POP ebp
RET 8
--------------------------------------
呼び出しの全コード
Function SetAsm(Asm As *Byte, Size As Long) As VoidPtr
SetAsm=VirtualAlloc(NULL, Size, MEM_COMMIT,PAGE_EXECUTE_READWRITE)
memcpy(SetAsm,Asm,Size)
EndFunction
Sub FreeAsm(Func As VoidPtr)
VirtualFree(Func, 0, MEM_DECOMMIT OR MEM_RELEASE)
EndSub
#N88BASIC
Dim Asm[ELM(00000035)]=[&H55, 'PUSH ebp
&H8B,&hEC, 'MOV ebp,esp
&H8B,&h45,&h8, 'MOV eax,[ebp
&H8B,&H08, 'MOV ecx,[ebx+si]
&H89,&h4d,&hFC, 'MOV [di,ecx
&H8B,&h55,&h8, 'MOV edx,[di
&H8B,&h45,&hC, 'MOV eax,[ebp
&H8B,&H08, 'MOV ecx,[ebx+si]
&H89,&h0A, 'MOV [ebp+si],ecx
&H8B,&h55,&hC, 'MOV edx,[di
&H8B,&h45,&hFC, 'MOV eax,[ebp
&H89,&h02, 'MOV [ebp+si],eax
&H8B,&hE5, 'MOV esp,ebp
&H5D, 'POP ebp
&HC2,8, 'RET 8
&h00] As Byte
Dim Swap3 As *Sub(p0 As *Long,p1 As *Long)'プロトタイプ宣言
Swap3 = SetAsm(Asm, ELM(35))
Dim a As Long, b As Long
a=666:b=893
Print a;b
Swap3(VarPtr(a),VarPtr(b))
Print a;b
FreeAsm(Swap3)