![]() |
(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:
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.
cmp eax, ebx
jne IsFalse push 1 jmp end IsFalse: push 0 end: 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 |
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.
![]() |
AW: (F)ASM: Flag zustand in register speichern?
Es gibt Instructions, um Register in Abhängigkeit von Flags zu setzen: Z.B.
Delphi-Quellcode:
für das Carry-Flag und
setc <byte-register>
Delphi-Quellcode:
für das Zero-Flag. Siehe auch
setz <byte-register>
![]() Deinen Code würde ich damit so schreiben:
Delphi-Quellcode:
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.)
// 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> ... |
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 |
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:
Was mir allerdings nicht klar ist :
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 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 |
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:
Beim parsen des Ausdrucks haben die einzelnen Bausteinfunktionen, keinerlei ahnung, was die anderen machen oder gemacht haben.
cmp eax, ebx
setne ah movsx eax, ah push eax wenn ich also folgendes habe:
Delphi-Quellcode:
Dan gehts als erstes so:
if (4+3*5 = 3) or (12/2 < 7)then
.... 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 |
AW: (F)ASM: Flag zustand in register speichern?
Zitat:
|
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 |
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 ;) |
AW: (F)ASM: Flag zustand in register speichern?
Zitat:
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 19:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz