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.