spinnt mein Atmel-Simulator, oder ich?

OP #4640284
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
Angehängte Dateien:
Gast #4640313
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?
Gast #4640324
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.
Gast #4640330
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.
OP #4640350
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 ! ))
Gast #4640383
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.
Gast #4640392
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren