Forum: Mikrocontroller und Digitale Elektronik spinnt mein Atmel-Simulator, oder ich?


von Florian S. (sirius7)


Angehängte Dateien:

Lesenswert?

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
von Peter II (Gast)


Lesenswert?

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.

von Florian S. (sirius7)


Angehängte Dateien:

Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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?

von Florian S. (sirius7)


Lesenswert?

Peter II schrieb:

> Was versteht du nun nicht?

ok, hab jetzt kapiert:) danke!

von Route_66 (Gast)


Lesenswert?

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.

von Route_66 (Gast)


Lesenswert?

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.

von Florian S. (sirius7)


Lesenswert?

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 ! ))

von Hanswurst (Gast)


Lesenswert?

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.

von Hanswurst (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.