Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   (F)ASM: Flag zustand in register speichern? (https://www.delphipraxis.net/167164-f-asm-flag-zustand-register-speichern.html)

Memnarch 15. Mär 2012 21:56

(F)ASM: Flag zustand in register speichern?
 
Nabend allerseits.
Wusste nicht genau wo es es am besten hinpasst. Hoffe die Frage passt hierhin:

Ich nutze seit kurzem FASM(Flat Assembler). Jetzt habe ich ja die möglichkeit zuerst über cmp einen wertevergleich machen zu lassen, und danach über abhängige jump befehle das resultat zu prüfen.

Jetzt ist es aber so, dass ich mehrere cmp befehle ausführen möchte und die ergebnisse davon verodern oder ver-unden möchte.

im moment würde es z.B. bei mir so aussehen:

Code:
cmp eax, ebx
jne IsFalse
push 1
jmp end
IsFalse:
push 0
end:
Somit hätte ich den zustand für später auf dem stack um dann nach einem zweiten prozedere vom selbigen später beite zustände verbinden könnte.
Aber so wie jetzt kann es nicht ganz sinn der sache sein oder?

Ich weiß, dass es noch pushf/popf gibt, aber das pusht mir doch gleich den gesammten flagregister rauf bzw holt in wieder runter.

Interressieren tut mich aber immer nur ein einzelnes(wenn ich das richtig im Kopf habe, gibts für jeden zustand(größer, kleiner, gleich, größergleich...) ein flag.

Hat da jemand eine Idee?

MFG
Memnarch

BUG 15. Mär 2012 22:33

AW: (F)ASM: Flag zustand in register speichern?
 
Man könnte die Berechnung direkt nach dem Vergleichen machen, dann spart man sich das Merken der einzelnen Bits.

RCL könnte praktisch sein, wenn du das Carry-Flag in ein Register schieben willst.

Namenloser 15. Mär 2012 22:47

AW: (F)ASM: Flag zustand in register speichern?
 
Es gibt Instructions, um Register in Abhängigkeit von Flags zu setzen: Z.B.
Delphi-Quellcode:
setc <byte-register>
für das Carry-Flag und
Delphi-Quellcode:
setz <byte-register>
für das Zero-Flag. Siehe auch diese Antwort bei StackOverflow mit Delphi-Beispiel.

Deinen Code würde ich damit so schreiben:
Delphi-Quellcode:
// edx = vergleichsdaten 1
// ebx = vergleichsdaten 2
// eax = ge-and-etes vergleichsergebnis

// eax und edx resetten
xor eax, eax
xor edx, edx

cmp edx, ebx
setz dl
and eax, edx

<nächstes edx und ebx laden>

cmp edx, ebx
setz dl
and eax, edx

<nächstes edx und ebx laden>

cmp edx, ebx
setz dl
and eax, edx

<nächstes edx und ebx laden>
...
Wenn alle verglichenen Werte identisch sind, ist eax am ende True, sonst False. (Auf den Stack schieben könntest du die Werte aber natürlich auch.)

Memnarch 16. Mär 2012 08:29

AW: (F)ASM: Flag zustand in register speichern?
 
@NamenLozer: Vielen dank. Das scheint mir eine praktikable lösung zu sein.

@Bug:
So einfach ist das nicht. Ich habe angefangen einen Compiler(?) zu schreiben, der aus dem SourceCode FASM generiert. Natürlich müssen dafür auch ausdrücke korrekt aufgelößt werden. und da können die operationen nicht immer direkt aufeinander folgen, da zuerst eine andere abhängigkeit aufgelößt/berechnet werden müsste.

PS: Der Compiler ist nur ne Spielerer(obwohl es bis jetzt ganz gut klappt :twisted:)


MFG
Memnarch

Amateurprofi 16. Mär 2012 09:00

AW: (F)ASM: Flag zustand in register speichern?
 
@NamenLozer:
Das wird so nicht funktionieren.
SetCC funktioniert nur mit Byte registern.

@Memnarch:
Wenn du die mehrere Vergleichsergebnisse mit AND oder Or verbinden willst und danach auf die "Summe" der Ergebnisse reagieren willst, dann reicht es doch wenn nur ein einiges Vergleichsergebnis "Aus der Reihe tanzt".
Ich würde das so machen:
Zum Beispiel für AND Verkknüpfung des Z-Flags
Delphi-Quellcode:
   xor eax,eax
   mov ecx,1
   ..
   cmp edx,ebx
   cmovne  eax,ecx
   ..
   cmp edx,ebx
   cmovne  eax,ecx
   ..
   test eax,eax
   je   @AlleTRUE
   jne  @MinEinerFalse
Was mir allerdings nicht klar ist :
Wenn du nur auf die "Summe" der Vergleiche reagieren willst, dann kannst du doch hinter jedem Vergleich einen entsprechenden Jcc einfügen, in obigem Beispiel also jne @MinEinerFalse

Memnarch 16. Mär 2012 10:57

AW: (F)ASM: Flag zustand in register speichern?
 
@AmateurProfi:
Ja habe ich schon gemerkt.
Deswegen habe ich den output meines Compilers so abgeändert:
Code:
cmp eax, ebx
setne ah
movsx eax, ah
push eax
Beim parsen des Ausdrucks haben die einzelnen Bausteinfunktionen, keinerlei ahnung, was die anderen machen oder gemacht haben.

wenn ich also folgendes habe:
Delphi-Quellcode:
if (4+3*5 = 3) or (12/2 < 7)then
....
Dan gehts als erstes so:
4 auf stack packen
3 auf stack packen
mul op kommt, wert von stack holen
mul mit 5
ergebnis auf stack packen
addition:
2 werte vom stack holen
addieren
auf den stack packen
3 auf den stack packen
vergleich durchführen
2 werte vom stack holen
vergleichen
ergbenis auf stack packen

jetzt wird als erstes mit der formel rechts vom or weiter gemacht, und danach ver-oderd

Die ungünstigen push/pop combis werden später nachträglich durch moves ersetzt.
Keine funktion weiß was die vorherige oder nächste macht. Aber jede weiß, dass sie ihre werte zum operieren auf dem stack findet und ihr ergebnis auf den stack pushen muss.
Variablen/konstanten: hier wird natürlich nichts gepopt, hier wird der wert direkt gepushed

Deswegen ist es nicht so leicht in einer komplexen formel beziehungen zwischen den einzelnen bausteinen schon im voraus zu optimieren

MFG
Memnarch

Namenloser 16. Mär 2012 15:32

AW: (F)ASM: Flag zustand in register speichern?
 
Zitat:

Zitat von Amateurprofi (Beitrag 1156841)
@NamenLozer:
Das wird so nicht funktionieren.
SetCC funktioniert nur mit Byte registern.

Ok, wusste ich nicht. Aus Gewohnheit benutze ich normalerweise die 32bit-Register, werde das gleich korrigieren ;)

Desmulator 16. Mär 2012 22:05

AW: (F)ASM: Flag zustand in register speichern?
 
Bei einem oder reicht es sobald eine der Bedingung wahr ist, also in dem oben beschriebenen Fall würdest du direkt in das if springen, sobald eine der Bedingungen wahr ist, wenn nicht wird halt die nächste überprüft, am ende, wenn keine zutrifft überspringst du das if einfach ...

Den Mechanismus des überspringen der weiteren Bedingungen erwartet man in manchen Sprachen sogar und man arbeitet damit.

Mit einem und läuft es ganz ähnlich, sobald eine nicht zustimmt ins else oder über das if springen.

So brauchst du nicht den stack zu nutzen. Darum gibt es in c auch extra & und &&. Einmal für ein if und einmal als Bitoperation. Wenn das ganze negiert ist drehst du einfach die Logik um.

Jetzt gibt es nurnoch das xor. Das ist schwer .. es lässt sich als not(A == B) darstellen. Wie auch immer man nutzt es selten und wenn dann auf Bit Operationen , daher kannst du hier deine stack Methode wie oben beschrieben machen

Memnarch 16. Mär 2012 22:37

AW: (F)ASM: Flag zustand in register speichern?
 
@Desmulator:
Das mit dem frühen abbruch habe ich (noch) nicht integriert, da es ein bisschen fuckelig wird, wenn über mehrere ebenen or/and benutzt wird. Deswegen schiebe ich das im Moment nach hinten. Habe zwar eine Idee wie sich das praktikabel integrieren lässt, aber da muss ich Montag erstmal gucken ;)

Medium 16. Mär 2012 23:39

AW: (F)ASM: Flag zustand in register speichern?
 
Zitat:

Zitat von Desmulator (Beitrag 1156996)
Darum gibt es in c auch extra & und &&. Einmal für ein if und einmal als Bitoperation.

IIRC ist && das, was man bei Delphi bekäme, wenn man (wie üblicherwise voreingestellt) "Vollständige Auswertung bool'scher Ausdrücke" abgeschaltet hat, während & immer zur vollständigen Auswertung führt (weswegen man es u.a. auch bevorzugt für Bitoperationen einsetzt).
Trägt zwar nicht so arg viel zum Thema bei, aber ich fühlte mich nach "sach dat ma" :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 Uhr.
Seite 1 von 2  1 2      

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