Registriert seit: 29. Mai 2002
37.621 Beiträge
Delphi 2006 Professional
|
Re: for Schleife in ASM
13. Jul 2006, 01:17
Ich habe es etwas umformuliert:
Zitat:
An dieser Stelle wird die Zählvariable dekrementiert mit dec. dec hat die Eigenschaft, dass wenn das dekrementierte Register null wird das Zero Flag (ZF) zusetzen. Dies wird ausgenutzt, um mittels des Sprungbefehls jnz ("springe, wenn das Zero Flag (ZF) im Flagsregister nicht gesetzt ist") zu entscheiden, ob gesprungen werden muss oder nicht. Ist das Zero Flag nicht gesetzt (null), wird gesprungen und zwar in diesem Fall an eine Adresse 8 Byte zurück: $-08, was Adresse 00402561 wäre, und wie man sieht, ist das unser Schleifenrumpf. Ansonsten wird nicht gesprungen und im Code weitergemacht.
Und das, die Überprüfung eines Flags im Flagregister, ist einfacher und damit schneller als das Vergleichen zweier Register auf Gleichheit / Ungleichheit. Und das müsste man machen, wenn die Schleife vorwärts läuft. In diesem Fall muss man die Zählvariable immer mit dem Endwert vergleichen, was bedeuten würde, dass man er mit dem ASM-Befehl cmp zwei Register vergleicht und erst dann ein Flag im Flagregister auswerten kann.
Michael Ein Teil meines Codes würde euch verunsichern.
|
|
Zitat
|