Die Sache funktioniert auch allerdings ist der Asm-Code langsamer als der Purebasic-Code. Kann mir da vieleicht einer auf die sprünge helfen was ich da falsch gemacht hab?
PureBasic-Code
Code: Alles auswählen
Procedure PatchMemory(OldFile.l,OldFileLen,NewFile.l,DiffInfo.l)
Define.b ChangeType
Define.l i,ChangeCnt,NewFileLen,OldFPos,NewFLen,ChangeOffset,ChangeLen,InitNewFile
InitNewFile = NewFile
NewFileLen = PeekL(DiffInfo)
ChangeCnt = PeekL(DiffInfo + 4)
DiffInfo = DiffInfo + 8
For i = 1 To ChangeCnt
ChangeType = PeekB(DiffInfo)
ChangeOffset = PeekL(DiffInfo + 1)
ChangeLen = PeekL(DiffInfo + 5)
DiffInfo = DiffInfo + 9
Select ChangeType
Case #PatchReplace
CopyMemory(OldFile + OldFPos,NewFile,ChangeOffset - OldFPos)
NewFile = NewFile + ChangeOffset - OldFPos
CopyMemory(DiffInfo,NewFile,ChangeLen)
DiffInfo = DiffInfo + ChangeLen
NewFile = NewFile + ChangeLen
OldFPos = ChangeOffset + ChangeLen
Case #PatchCut
CopyMemory(OldFile + OldFPos,NewFile,ChangeOffset - OldFPos)
NewFile = NewFile + ChangeOffset - OldFPos
OldFPos = ChangeOffset + ChangeLen
Case #PatchPaste
CopyMemory(OldFile + OldFPos,NewFile,ChangeOffset - OldFPos)
NewFile = NewFile + ChangeOffset - OldFPos
CopyMemory(DiffInfo,NewFile,ChangeLen)
DiffInfo = DiffInfo + ChangeLen
NewFile = NewFile + ChangeLen
OldFPos = ChangeOffset
EndSelect
Next
EndProcedure
Code: Alles auswählen
Procedure PatchMemory(OldFile.l,OldFileLen,NewFile.l,DiffInfo.l)
Define.l i,NewFileLen,OldFPos,NewFLen,InitNewFile,Count
;eax = OldFPos
;ecx = Arbeitsregister
;edx = DiffInfo
;ebx = ChangeOffset
;ebp = ChangeLen
;esi = OldFile
;edi = NewFile
!mov edx,[p.v_DiffInfo]
!mov esi,[p.v_OldFile]
!mov edi,[p.v_NewFile]
!mov [p.v_InitNewFile],edi
!mov eax,[edx]
!mov [p.v_NewFileLen],eax
!mov eax,[edx+4]
!add edx,8
!mov [p.v_i],eax
!PatchLoopStart:
!mov eax,[p.v_OldFPos]
!mov cl,[edx]
!mov ebx,[edx+1]
!mov ebp,[edx+5]
!add edx,9
!cmp cl,1
!je PatchReplace
!cmp cl,2
!je PatchCut
!jmp PatchPaste
!PatchReplace:
;unveränderte Daten kopieren
!mov ecx,ebx
!sub ecx,eax
!call CopyMem
;veränderte Daten kopieren
!mov ecx,ebp
!push esi
!mov esi,edx
!call CopyMem
!pop esi
;Berechnungen
!add esi,ebp
!add edx,ebp
!mov eax,ebx
!add eax,ebp
!jmp CaseEnd
!PatchCut:
;unveränderte Daten kopieren
!mov ecx,ebx
!sub ecx,eax
!call CopyMem
;Berechnungen
!add esi,ebp
!mov eax,ebx
!add eax,ebp
!jmp CaseEnd
!PatchPaste:
;unveränderte Daten kopieren
!mov ecx,ebx
!sub ecx,eax
!call CopyMem
;einzufügende Daten kopieren
!mov ecx,ebp
!push esi
!mov esi,edx
!call CopyMem
!pop esi
;Berechnungen
!add edx,ebp
!mov eax,ebx
!jmp CaseEnd
!CopyMem:
!push ecx
!shr ecx,2
!rep movsd
!pop ecx
!and ecx,3
!rep movsb
!ret
!CaseEnd:
!mov [p.v_OldFPos],eax
!mov ecx,[p.v_i]
!dec ecx
!mov [p.v_i],ecx
!cmp ecx,0
!jne PatchLoopStart
EndProcedure