Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: asm vergleich? (Assembler gegen delphi prog)

  Alt 12. Mär 2007, 10:07
Bitte immer die Register retten!
Es kann in einfachen Funktionen gut gehen, aber meistens geht es schief, wenn die Register nicht gerettet werden.
Ausnahmen sind EAX, EDX und ECX. Die müssen nicht gerettet werden (wobei dieser Satz mit Vorsicht zu genießen ist). Das gilt allerdings auch nur, wenn du deine ganze Funktion in Assembler schreibst. Ein Mix aus Delphi und ASM in einer Funktion ist schon gefährlich genug. Allerdings würde ich da nicht auf den Compiler hoffen, dass er aufpasst, welche Register du verwendest.


Edit: Was erwartest du eigentlich aus einem Vergleich? Bzw. was ist deine Vergleichsfunktion? Eine einfache Addition o.ä. ist nix, womit du den Compiler herausfordern kannst.

Am Besipiel der Addition:
Du willst for i:=1 to c do result1:=wert1+wert2; machen.

Dein Code sieht so aus:
Delphi-Quellcode:
asm
  MOV ECX,c
  @schleife1:
  MOV EAX,wert1
  ADD EAX,wert2
  LOOP @schleife1
  MOV result1,EAX
end;
1. Frage: Was ist wenn c<1 ist?
2. Anmerkung: Du solltest schon das Ergebnis innerhalb der Schleife speichern, ansonsten gibt es keine entsprechende Pascal-Version, mit der du vergleichen könntest (wobei man in solchen Momenten ASM einsetzt, wenn es keine einfache Pascal-Version gibt).

So, und was macht der Delphi-Compiler:
Delphi-Quellcode:
asm
  mov eax,c
  test eax,eax
  jle @_end
@_begin:
  mov edx,wert1
  add edx,wert2
  mov result1,edx
  dec eax
  jnz @_begin
@_end:
end;
Der Unterschied liegt in dem "loop" zu "dec + jnz". Wobei mir in Erinnerung ist, dass loop langsamer ist. Das hat irgendetwas mit dem Pipelining zu tun.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat