Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Delphi-Assembler wie macht man ein "IF .. THEN ..." (https://www.delphipraxis.net/121824-delphi-assembler-wie-macht-man-ein-if-then.html)

turboPASCAL 5. Okt 2008 13:21


Delphi-Assembler wie macht man ein "IF .. THEN ..."
 
Hi,

ich komm im Moment nicht weiter im "grünen" Bereich: :wink:

Delphi-Quellcode:
    procedure DepthByte_To_AlphaByte(pData: Pointer; Size: Integer);
  asm
    push ebx
    test edx,edx
    jz @@end

  @@loop :
    mov bl,[eax+0] // Blue Byte
    mov bh,[eax+1] // Green Byte
    mov cl,[eax+2] // Red Byte
    mov ch,[eax+3] // Alpha Byte

   // todo:
   // if Alpha > 0 then Alpha := 255;

    mov [eax+0],cl // Bits tauschen
    mov [eax+1],bh
    mov [eax+2],ch
    mov [eax+3],bl

    add eax, 4
    sub edx, 4
    jnle @@loop
  @@end:
    pop ebx
  end;

Apollonius 5. Okt 2008 13:26

Re: Delphi-Assembler wie macht man ein "IF .. THEN ...&
 
Delphi-Quellcode:
cmp ch, 0
jz @@Ahead
mov ch, 255
@@Ahead:
Meintest du das?

hoika 5. Okt 2008 13:27

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

per cmp oder test (hast du ja schon drin).


Assembler
dort nach "
Delphi-Quellcode:
bedingte Sprünge
" suchen.


Ein Trick ist, einfach das ganze mal per Delphi zu schreiben,
und dann in der CPU-Ansicht den Assembler-Code anzusehen.


Heiko

Balu der Bär 5. Okt 2008 13:29

Re: Delphi-Assembler wie macht man ein "IF .. THEN ...&
 
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.

turboPASCAL 5. Okt 2008 13:41

Re: Delphi-Assembler wie macht man ein "IF .. THEN ...&
 
@BdB danke, ich seh da zwar durch, (lesen ist ok) nur selbermachen geht sicht (asm code schreiben: :kotz: )

@Apollonius, ja das meine ich.

"jz" ist aber glaube ich falsch. Sollte das nicht "jnz" sein ? :gruebel:

Apollonius 5. Okt 2008 13:45

Re: Delphi-Assembler wie macht man ein "IF .. THEN ...&
 
Wieso? Du kannst natürlich auch test ch, ch nehmen, aber das Resultat ist das gleiche und der Maschinencode auch nicht länger.

turboPASCAL 5. Okt 2008 13:46

Re: Delphi-Assembler wie macht man ein "IF .. THEN ...&
 
Hatte mich vertippt, siehe oben.

Oder, habe ich mich verhauen in Code... ? :gruebel:

Apollonius 5. Okt 2008 13:50

Re: Delphi-Assembler wie macht man ein "IF .. THEN ...&
 
Du musst immer die gegensätzliche Bedingung zum Springen nehmen: Wenn ch = 0, dann tu nichts (= springe über die Anweisung).

turboPASCAL 5. Okt 2008 14:19

Re: Delphi-Assembler wie macht man ein "IF .. THEN ...&
 
Sorry, simmt alles und klappt super.
Ich habe nur versucht etws zu Vergleichen was nicht da war. :mrgreen: :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz