Carry-Flag abfragen
-
Hallo,
ich mache in meinem C-Programm einen Interruptaufruf mit asm. Das Ganze haut auch recht schön hin, aber ich hab leider keine Ahnung wie ich das Carry-Flag abfragen kann. Kann mir einer von euch dabei helfen?
-
mit dem JC Befehl, "jump on carry".
-
Aja und wie funktioniert das?? Kannst du mir mal ein Beispiel geben?
Ich bin totaler Newbie in Assembler. Ist dieses JC eine Art Sprungbefehl, wenn das Carry-Flag gesetzt ist, a la goto??
-
Ähm, ich glaub ich hab dich falsch verstanden. Programmierst du jetzt in Assembler oder Inline-Assembler, oder doch in C? Ich denk ja jetzt doch eher C ...
Weiß nicht ob dir das hilft, so gehts jedenfalls ungefähr unter Turbo C++ 3.0:union REGS r; // r füllen int86(0x21, &r, &r); if (r.x.flags & 1) { // oops, carry-flag gesetzt }
bin mir mit den Namen nicht mehr ganz sicher, aber das Carry-Flag ist Bit 0 im Flags-Register. In Assembler würde das so aussehen:
INT 021h JNC ok ;; mööp, Fehler behandeln ;; ... ok: ;; weiter hier ;; lalala
-
@Bashar
Es ist Inline-Assembler (hätte ich wohl dazuschreiben sollen). Die Konstruktion mit int86 hab ich schon benutzt. Da bekomm ich aber einen Fehler zurück (errno bzw. _doserrno). Jetzt wollte ich das Ganze in Inline-Assembler ausprobieren. Nur muss ich hald auch das Carry-Flag abfragen, um zu erfahren, ob der Aufruf korrekt vonstatten gegangen ist.Ich glaube das zweite Beispiel von dir, hilft mir weiter. Wenn ich das richtig verstehe, dann springt das Programm zur Marke "ok:", wenn das Carry-Flag (Bit 0 im Statusregister) den Wert 0 hat, richtig?
-
Genau. JNC springt genau dann, wenn Carry nicht gesetzt ist.
-
Ok, danke dir
-
und JC, wenn es gesetzt ist
kannst das auch mit clc löschen bzw. mit stc setzen oder mit pushf auf den stack und dann mit pop ax hastes im AX-Reg
cu todo