AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein (F)ASM: Flag zustand in register speichern?
Thema durchsuchen
Ansicht
Themen-Optionen

(F)ASM: Flag zustand in register speichern?

Ein Thema von Memnarch · begonnen am 15. Mär 2012 · letzter Beitrag vom 17. Mär 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

(F)ASM: Flag zustand in register speichern?

  Alt 15. Mär 2012, 21:56
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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

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

  Alt 15. Mär 2012, 22:33
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.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

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

  Alt 15. Mär 2012, 22:47
Es gibt Instructions, um Register in Abhängigkeit von Flags zu setzen: Z.B. setc <byte-register> für das Carry-Flag und 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.)

Geändert von Namenloser (16. Mär 2012 um 16:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#4

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

  Alt 16. Mär 2012, 08:29
@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 )


MFG
Memnarch
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#5

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

  Alt 16. Mär 2012, 09:00
@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
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....

Geändert von Amateurprofi (16. Mär 2012 um 09:15 Uhr) Grund: hatte letzten Beitrag noch nicht gelesen
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#6

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

  Alt 16. Mär 2012, 10:57
@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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

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

  Alt 16. Mär 2012, 15:32
@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
  Mit Zitat antworten Zitat
Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#8

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

  Alt 16. Mär 2012, 22:05
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
Lars
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#9

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

  Alt 16. Mär 2012, 22:37
@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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#10

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

  Alt 16. Mär 2012, 23:39
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"
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:39 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