Einzelnen Beitrag anzeigen

Balu der Bär
(Gast)

n/a Beiträge
 
#4

Re: Delphi-Assembler wie macht man ein "IF .. THEN ...&

  Alt 5. Okt 2008, 13:29
Vlt. hilft das ein wenig.

Zitat:
3.4 Bedingte Sprünge
Auf Sprünge bin ich ja bereits im Kapitel 2.2 eher kurz eingegangen. Mittels JMP kann man direkt z.B. zu einem Label springen. Nun gibt es noch bedingte Sprünge (Auflistung im Kapitel 2.2). Diese ermöglichen es uns unter anderem, aus Delphi bekannte if .. then .. - Bedingungen auch in Assembler umzusetzen. Dies geht in ASM natürlich nicht so schnell und leicht wie in Delphi, ähnelt sich aber stark. Im nachfolgenden erst einmal eine Beispielbedingung in Delphi, danach diese Bedingung in Assembler.
Delphi-Quellcode:
function GroesserOderKleiner(X, Y : Integer) : String;
begin
  if x < y then result := 'X kleiner als Y'
   else result := 'X größer als Y';
end;
Und jetzt das ganze in Assembler (zum besseren Verständnis Kommentare hinzugefügt):
Delphi-Quellcode:
function GroesserOderKleiner(X, Y : Integer) : PChar;
asm
  JMP @start // Springe zu @start
  @groesser: DB 'X groesser als Y', 0 // Variable groesser wird erstellt
  @kleiner: DB 'X kleiner als Y', 0 // Variable kleiner wird erstellt
  @start: CMP EAX, EDX // Vergleiche EAX (X) mit EDX (Y)
  JA @IsBigger // Wenn EAX größer springe zu @IsBigger
  LEA EAX, @kleiner // Sonst gib @kleiner aus
  RET
  @IsBigger: LEA EAX, @groesser //gib @groesser aus
end;
Die Delphi-Funktion ist schnell erklärt. Es wird geprüft ob X kleiner als Y ist, wenn dem so ist wird die entsprechende Meldung ausgegeben, wenn nicht wird ausgeben, dass X größer als Y ist. Bei unserer Assembler-Funktion ist das ganze schon einen Tick komplizierter. Unsere erste Codezeile springt zum Label @start. In den nächsten zwei Zeilen erstellen wir die beiden Variablen, die unseren Ausgabetext enthalten. Mittels CMP EAX, EDX vergleichen wir jetzt die beiden Register (also X und Y) miteinander. JA @IsBigger ist nun der bedingte Sprung. JA (Springe wenn größer) springt wenn X größer ist als Y zum Label @IsBigger (welches den @groesser-Text ausgibt), ist X nicht größer als Y wird der @kleiner-Text ausgegeben. So kann man doch recht einfach auch mit Assembler Bedingungen prüfen und entsprechend handeln.
  Mit Zitat antworten Zitat