AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Delphi-Assembler wie macht man ein "IF .. THEN ..."

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

Ein Thema von turboPASCAL · begonnen am 5. Okt 2008 · letzter Beitrag vom 5. Okt 2008
Antwort Antwort
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#1

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

  Alt 5. Okt 2008, 14:21
Hi,

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

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;
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

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

  Alt 5. Okt 2008, 14:26
Delphi-Quellcode:
cmp ch, 0
jz @@Ahead
mov ch, 255
@@Ahead:
Meintest du das?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 5. Okt 2008, 14:27
Hallo,

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


Assembler
dort nach "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
Heiko
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#4

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

  Alt 5. Okt 2008, 14: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
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#5

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

  Alt 5. Okt 2008, 14:41
@BdB danke, ich seh da zwar durch, (lesen ist ok) nur selbermachen geht sicht (asm code schreiben: )

@Apollonius, ja das meine ich.

"jz" ist aber glaube ich falsch. Sollte das nicht "jnz" sein ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

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

  Alt 5. Okt 2008, 14:45
Wieso? Du kannst natürlich auch test ch, ch nehmen, aber das Resultat ist das gleiche und der Maschinencode auch nicht länger.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#7

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

  Alt 5. Okt 2008, 14:46
Hatte mich vertippt, siehe oben.

Oder, habe ich mich verhauen in Code... ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

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

  Alt 5. Okt 2008, 14:50
Du musst immer die gegensätzliche Bedingung zum Springen nehmen: Wenn ch = 0, dann tu nichts (= springe über die Anweisung).
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#9

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

  Alt 5. Okt 2008, 15:19
Sorry, simmt alles und klappt super.
Ich habe nur versucht etws zu Vergleichen was nicht da war.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:42 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