x86 Assembly: INC- und DEC-Anweisung und Überlauf-Flag

ei einer x86-Assembly wird das Überlaufflag gesetzt, wenn einadd odersub Operation für eine Ganzzahl mit Vorzeichen läuft über, und das Übertragsflag wird gesetzt, wenn eine Operation für eine Ganzzahl ohne Vorzeichen läuft.

Allerdings, wenn es um die @ kominc unddecei anweisungen scheint die situation etwas anders zu sein. DemzufolgeWebseit, dasinc -Anweisung wirkt sich überhaupt nicht auf das Übertragsflag aus.

Aber ich kann keine Informationen darüber finden, wieinc unddec wirkt sich, wenn überhaupt, auf das Überlauf-Flag aus.

Tuninc oderdec Setzen Sie das Überlauf-Flag, wenn ein ganzzahliger Überlauf auftritt. Und ist dieses Verhalten für vorzeichenbehaftete und vorzeichenlose Ganzzahlen gleich?

============================BEARBEITE ============================

Okay, daher besteht der Konsens hier im Wesentlichen darin, dass INC und DEC sich in Bezug auf das Setzen von Flags mit Ausnahme des Übertragsflags wie ADD und SUB verhalten sollten. Dies steht auch im Intel-Handbuch.

Das Problem ist, dass ich dieses Verhalten in der Praxis nicht reproduzieren kann, wenn es um Ganzzahlen ohne Vorzeichen geht.

Betrachten Sie den folgenden Assembly-Code (verwenden Sie die GCC-Inline-Assembly, um das Drucken der Ergebnisse zu vereinfachen.)

int8_t ovf = 0;

__asm__
(
    "movb $-128, %%bh;"
    "decb %%bh;"
    "seto %b0;"
    : "=g"(ovf)
    :
    : "%bh"
);

printf("Overflow flag: %d\n", ovf);

Hier dekrementieren wir einen vorzeichenbehafteten 8-Bit-Wert von -128. Da -128 der kleinstmögliche Wert ist, ist ein Überlauf unvermeidlich. Wie erwartet wird folgendes ausgedruckt:Overflow flag: 1

Aber wenn wir dasselbe mit einem @ machohne Vorzeiche Wert, das Verhalten ist nicht so wie ich es erwartet habe:

int8_t ovf = 0;

__asm__
(
    "movb $255, %%bh;"
    "incb %%bh;"
    "seto %b0;"
    : "=g"(ovf)
    :
    : "%bh"
);

printf("Overflow flag: %d\n", ovf);

Hier inkrementiere ich einen vorzeichenlosen 8-Bit-Wert von 255. Da 255 der größtmögliche Wert ist, ist ein Überlauf unvermeidlich. Dies gibt jedoch Folgendes aus:Overflow flag: 0.

Huh? Warum hat es in diesem Fall das Überlauf-Flag nicht gesetzt?

Antworten auf die Frage(14)

Ihre Antwort auf die Frage