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
Gast
#4640288
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.
Gast
#4640313
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?
Peter II schrieb: > Was versteht du nun nicht? ok, hab jetzt kapiert:) danke!
Gast
#4640324
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.
Gast
#4640330
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 ! ))
Gast
#4640383
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.
Gast
#4640392
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.

