![]() |
Problem mit Overflow
Hi,
ich weiss, dass das eine dumme Formulierung ist, aber mir ist nichts besseres eingefallen. Zum Problem: Wenn nun Byte1:= 180 und Byte2:= 90, und wenn ich diese addiere kommt glaub ich 15 raus, es gibt also einen Überlauf, kann ich irgendwie überprüfen ob es einen Overflow gibt oder bei der letzten Operation gab? Das würde alles wesentlich vereinfachen, bei Additionen. Vielen Dank für jede Resonanz. Gruß DelphiFreund |
Re: Problem mit Overflow
Du kannst irgendwo in den Tiefen des Compilers eine "Exeption bei Überlauf" bzw. "Überlaufprüfung" aktivieren ...
|
Re: Problem mit Overflow
Klingt gut, ich mach mich auf die Suche.
Wer sucht wird fündig :) : Hier die direktiven: {$OVERFLOWCHECKS ON} oder {$OVERFLOWCHECKS OFF} |
Re: Problem mit Overflow
Sonst:
Compilerbefehl:
Delphi-Quellcode:
{$Q+}
|
Re: Problem mit Overflow
Und gleiches per Code abfangen/abfragen?
Pseudocode:
Code:
Ich hab versucht mit dem Carry-Flag zu experimentieren.
var Zahl : Byte;
... Zahl := 200; inc (Zahl, 100); if (überlauf) then ... Asm-Pseudocode:
Code:
Funktioniert im genannten Beispiel. Funktioniert aber nicht nach z.B. GetFileSize :gruebel:
function Carry : boolean; Register;
asm push EAX jc @@C // jump if carry jmp @@NC @@C: // carry mov AL, 1 jmp @@end @@NC: // no-carry mov AL, 0 @@end: mov Result, AL // mov Result pop EAX end; ... Zahl := 200; inc (Zahl, 100); if (Carry) then ... Reicht das Carry-Flag um auf einen Überlauf zu prüfen? |
Re: Problem mit Overflow
Dafür gibt es das Overflow Flag.
Mach den Compilerschalter an und rechne es in Delphi innerhalb eines Try/Except Blockes. Wenn es eine EOverflow Exception gibt, dann ist ein Überlauf aufgetreten. |
Re: Problem mit Overflow
Delphi-Quellcode:
function Carry : boolean;
asm db 0d6h end; |
Re: Problem mit Overflow
Über einen try/except-Block wollte ich es nicht machen sondern über eine einfache Funktion.
Brechis Beispiel funktioniert soweit. Nur was passiert hier? Meine Asm-Referenz gibt zu db nicht viel her. Und das was es hergibt ist wohl das falsche (define byte - reserviert ein Byte an Speicherplatz im Programm... Buch Assembler Ge-packt) :gruebel: Vielen Dank 4 Help :) Edit: Delphi zaubert aus db 0D6h db 1. Warum? |
Re: Problem mit Overflow
Hallo,
auf den korrekten Zustand des Overflow- oder Carry-Flags nach einer Addition zweier Bytes würde ich mich nicht verlassen. Die Addition wird häufig - nach einer Erweiterung der Operanden auf 32 Bit - durch eine 32-Bit-Addition oder einen LEA-Befehl durchgeführt. In diesen Fällen besitzen die genannten Flags keine Aussagekraft. Gruß Hawkeye |
Re: Problem mit Overflow
Genau das habe ich gemerkt, nachdem die Funktion GetFileSize ausgeführt wurde.
... Wie kann ich sonst mit einer einfachen Funktion den Überlauf prüfen? Wenns geht ohne einem Try/Exception-Block. Oder frage ich mal anders, was genau macht der Try-Except-Block bei einem Überlauf? Wie überprüft er diesen? :| |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:02 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 by Thomas Breitkreuz