Hilfe bei Asm-Optimierung gesucht
Verfasst: 27.01.2007 18:15
So wiedermal ne Assembler-Anfängergeschichte von mir. Also ich hab einen Differenzialpatcher in PureBasic geschrieben. Die Patchroutine hab ich dann mit meinen Anfängerkenntnisen nach Assembler übersetzt, als Lernübung.
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
Assembler-Code
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