![]() |
Int64-Überlauf erkennen / Registerabfrage
Hallo,
gibt es eine Möglichkeit zu erkennen, ob bei einer Rechenoperation mit Int64-Typen ein Überlauf aufgetreten ist? Und zwar das ganze nicht über den Overflowcheck des Compilers, sondern z.B. über eine Auswertung der Prozessorregister. Ich kenne mich mit asm leider nicht aus und weiß daher nicht, was die CPU in irgendwelchen Flag-Registern im Falle eines Überlaufs hinterlässt und wie man das abfragen kann. Wer kann mir hier weiterhelfen? |
AW: Int64-Überlauf erkennen / Registerabfrage
Knifflig. Wenn Du überhaupt eine Chance haben will, mußt Du wahrscheinlich Deine ganzen Rechnungen in elementare Schritte aufteilen und nach jeden Schritt prüfen. Beispiel:
Delphi-Quellcode:
In ** ist nach der Zuweisung kein Overflow erkennbar, effektiv ist das ja y := x +1. Aber es sind ja eigentlich zwei Overflows aufgetreten.
var
x,y: int64; begin x := $7fffffffabcd1234; y := x + $7890abcd; // Overflow erkennbar y := ((x+ $7890abcd) - $7890abcd) + 1; //** end; |
AW: Int64-Überlauf erkennen / Registerabfrage
Aufteilung in elementare Schritte und Prüfung nach jedem Schritt wäre kein Problem, ist genau das, was ich machen möchte!
(wollte man erst am Ende einer längeren Rechung festellen, ob irgendwo ein Überlauf aufgetreten ist, wäre wahrscheinlich die try-Except-Variante bei eingeschalteter Überlaufprüfung durch den Compiler das praktischste...) |
AW: Int64-Überlauf erkennen / Registerabfrage
über Register wäre so:
Delphi-Quellcode:
function getFlags:Integer;
asm pushfd pop eax end; procedure TForm1.Button1Click(Sender: TObject); var x:int64; begin x:=$7FFFFFFFFFFFFFFF; x:=x+1; if (getFlags and ($800))<>0 then //$800 : Testen der Flags ob OL gesetzt ist showmessage('Überlauf: '+inttostr(x)); end; |
AW: Int64-Überlauf erkennen / Registerabfrage
Danke, das sieht schon ganz gut aus.
Kann man das auch als inline-Funktion mit boolschem Rückgabewert realisieren? |
AW: Int64-Überlauf erkennen / Registerabfrage
Delphi-Quellcode:
inline hat mein D7 nicht, musst du mal testen.
function isOLFlag:boolean;
asm pushfd pop eax and eax,$800 shr eax,11 end; |
AW: Int64-Überlauf erkennen / Registerabfrage
Delphi-Quellcode:
So sollte es klappen, wen man GetFlags hier wiederverwendet.
function IsOverFlow(): Boolean;
begin Result := (getFlags and ($800))<>0; end; EDIT: mist sirius war schneller^^ MFG Memnarch |
AW: Int64-Überlauf erkennen / Registerabfrage
Hallo !
Danke, Problem gelöst!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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