liebe Community, gerade habe ich mit meinem Simulator versucht den Befehl sbc (Subtrahiere Register mit Carry-Flag) ausprobiert. Register waren r16 mit 0x03 und r17 0x02 geladen und Carry-Flag habe ich eingeschaltet. Also sollte 0x00 rauskommen. Was auch geschah (Bild) Doch Z-Flag wurde nicht 1 gesetzt, was mich aber gewaltig irritiert und ich hoffe mal wirklich, dass mein Simulator spinnt, weil sonst bricht meine Welt zusammen. was sagt Ihr dazu? Bild beigefügt
:
Bearbeitet durch User
Alex S. schrieb: > Doch Z-Flag wurde nicht 1 gesetzt, was mich aber gewaltig irritiert und > ich hoffe mal wirklich, dass mein Simulator spinnt, weil sonst erkenne > ich die Welt nicht mehr. hast du mal in die doku geschaut? http://www.atmel.com/images/Atmel-0856-AVR-Instruction-Set-Manual.pdf Z: Previous value remains unchanged when the result is zero; cleared otherwise.
Peter II schrieb: > Z: > Previous value remains unchanged when the result is zero; cleared > otherwise. sorry, kann das aber nicht genau nachvollziehen. Wenn ich das gleiche mit sub mache und die Register gleich lade, wird Z=1. Kapiere nicht den Unterschied.
Alex S. schrieb: > sorry, kann das aber nicht genau nachvollziehen. Wenn ich das gleiche > mit sub mache und die Register gleich lade, wird Z=1. Kapiere nicht den > Unterschied. bei Sub steht ja auch: Z: Set if the result is $00; cleared otherwise. Was versteht du nun nicht?
Alex S. schrieb: > sorry, kann das aber nicht genau nachvollziehen. Wenn ich das gleiche > mit sub mache und die Register gleich lade, wird Z=1. Kapiere nicht den > Unterschied. Das erscheint zunächst unlogisch. Wenn man aber versucht, eine 16-Bit-Subtraktion zu machen, dann erkennt man den Sinn: Erst die beiden High-Register mit SUB subtrahieren, wenn das Null ergibt wird Z gesetzt. Wenn die beiden Low-Register danach mit SBC voneinander abgezogen werden, dann bleibt Z gesetzt wenn da auch Null rauskommt, und Z wird gelöscht wenn da nicht Null rauskommt.
Alex S. schrieb: > sorry, kann das aber nicht genau nachvollziehen. Wenn ich das gleiche > mit sub mache und die Register gleich lade, wird Z=1. Kapiere nicht den > Unterschied. Das erscheint zunächst unlogisch. Wenn man aber versucht, eine 16-Bit-Subtraktion zu machen, dann erkennt man den Sinn: Erst die beiden High-Register mit SUB subtrahieren, wenn das Null ergibt wird Z gesetzt. Wenn die beiden Low-Register danach mit SBC voneinander abgezogen werden, dann bleibt Z gesetzt wenn da auch Null rauskommt, und Z wird gelöscht wenn da nicht Null rauskommt. Wenn schon bei der High-Subtraktion ungleich Null rauskam, bleibt das Z gelöscht, auch wenn anschließend bei der Low-Subtraktion mit Carry Null rauskommt.
Route_66 schrieb: > Das erscheint zunächst unlogisch. > Wenn man aber versucht, eine 16-Bit-Subtraktion zu machen, dann erkennt > man den Sinn: > Erst die beiden High-Register mit SUB subtrahieren, wenn das Null ergibt > wird Z gesetzt. Wenn die beiden Low-Register danach mit SBC voneinander > abgezogen werden, dann bleibt Z gesetzt wenn da auch Null rauskommt, und > Z wird gelöscht wenn da nicht Null rauskommt. > > Wenn schon bei der High-Subtraktion ungleich Null rauskam, bleibt das Z > gelöscht, auch wenn anschließend bei der Low-Subtraktion mit Carry Null > rauskommt. ach ok, das erklärt einiges. Das ist also extra Befehl um die Low Bits einer 16 Bit Zahl nach sub zu subtrahieren. Jetzt kommts, danke ! ))
Route_66 wollte sicher darauf hinaus, dass man mit dem Verhalten von sub/sbc in Bezug auf das Z-Flag, bei einer 16-Bit-Subtraktion feststellen kann, ob das Resultat 0 ist oder nicht. Allerdings hat er, - sehr wahrscheinlich versehentlich -, die Reihenfolge falsch herum beschrieben. Richtig ist, dass zuerst mit sub die Low-Bytes voneinander subtrahiert werden, und erst dann die High-Bytes mit sbc, was das Carry-Flag berücksichtig. Das Z-Flag bleibt ungeändert.
Es muss natürlich heissen:
>Das Z-Flag bleibt ungeändert ...
falls es nach SUB gesetzt war und auch mit sbc wieder 0 errechnet wird
oder falls es 0 war; dann ist es egal, wie das Resultat von sbc
aussieht.
Sorry.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.