Forum: Mikrocontroller und Digitale Elektronik 8051 größer als Test: Carry vorher löschen ?


von H-G S. (haenschen)


Lesenswert?

Hallo!

Ich müsste in Assembler für den 8051 testen, ob der Akku-Inhalt kleiner 
gleich einem Wert ist.

Das soll ja so funktionieren:

SUBB A, #Wert
JZ Akku_war_gleich_dem_Wert
JNC Akku_war_größer_als_Wert

Ansonsten war der Akku-Inhalt kleiner als der Wert.

EDIT: so ähnlich jedenfalls, mir fallen gerade nicht die genauen idealen 
Befehle für den 8051 ein.



Mögliches Problem las ich im Netz:
Das Carry-Flag sollte eventuell vorher per Befehl gelöscht werden.

Stimmt das ?

: Bearbeitet durch User
von löffler (Gast)


Lesenswert?

H-G S. schrieb:
> Mögliches Problem las ich im Netz:
> Das Carry-Flag sollte eventuell vorher per Befehl gelöscht werden.

> Stimmt das ?

Ja. Wenn unklar, dann Befehlsbeschreibung zum SUBB lesen.

von Peter D. (peda)


Lesenswert?

H-G S. schrieb:
> Das Carry-Flag sollte eventuell vorher per Befehl gelöscht werden.

Es geht auch ohne:
1.
1
  add a, #-Wert
2
  jz gleich
3
  jc groesser

2.
1
  cjne a, #wert, ungleich
2
gleich:
3
4
ungleich:
5
  jc kleiner

von H-G S. (haenschen)


Angehängte Dateien:

Lesenswert?

Es scheint komplizierter als gedacht!

In dem Programmier-Manual stand das im Bild angehängte :-)

von (prx) A. K. (prx)


Lesenswert?

H-G S. schrieb:
> Es scheint komplizierter als gedacht!

Inwiefern? SUBB ist einfach. Die Carry-Logik bei SUBB ist sogar mit 
Carry=1 als Borrow=1. Das gibts anderswo auch andersrum, nämlich wenn 
die Subtraktion eigentlich als Add Complement ausführt wird (6502, ARM).

Komplizierter ist nur, dass es dein gewünschtes SUBB A,#Wert nicht gibt, 
aber den Ersatz hat Peter schon beschrieben. Komplizierter deshalb, weil 
bei ADD A,#-Wert natürlich das eben erwähnte inverse Borrow rauskommt, 
also Carry=1 ist dann Borrow=0. Und der Sprung also grad umgekehrt läuft 
wie bei SUBB.

: Bearbeitet durch User
von H-G S. (haenschen)


Lesenswert?

In dem Text steht dass wenn Carry vorher 1 war wird dieses vom Akku 
abgezogen.

Ich sollte es alleine schon deswegen vorher löschen nehme ich an ?


Hat mich das Auxiliary Carry (?) (AC) zu interessieren ?

von (prx) A. K. (prx)


Lesenswert?

H-G S. schrieb:
> Ich sollte es alleine schon deswegen vorher löschen nehme ich an ?

Yep. Und das steht auch da.

> Hat mich das Auxiliary Carry (?) (AC) zu interessieren ?

Nö. Das wird nur bei dezimaler Rechnung im BCD-Format interessant.

von (prx) A. K. (prx)


Lesenswert?

A. K. schrieb:
> Komplizierter ist nur, dass es dein gewünschtes SUBB A,#Wert nicht gibt,

Meinte SUB A,#Wert.

von H-G S. (haenschen)


Lesenswert?

Gut zu wissen!

Mein Programm funktionierte nämlich in den letzten Tests.
Wenn ich nicht zufällig auf das Carry-Löschen gestossen wäre (in einem 
Forum) dann würde ich wohl irgendwann Probleme bekommen ...

von Peter D. (peda)


Lesenswert?

H-G S. schrieb:
> Es scheint komplizierter als gedacht!

Finde ich nicht. Der 8051 Befehlssatz ist sehr gut durchdacht. Die 
wenigen Befehle, die Flags auswerten oder ändern, lassen sich leicht 
merken.
Viele Befehle ändern Flags nicht. Man hat daher nur wenig Seiteneffekte 
bzw. muß das PSW in Interrupts oft nicht sichern.
Eine Besonderheit ist, daß es kein Z-Flag gibt, JZ/JNZ werten den Inhalt 
des ACC direkt aus.

von торфкопф (Gast)


Lesenswert?

Ich empfehle das ASM Instruction Manual zu lesen. Fuer jeden Befehl ist 
aufgelistet, welche Flags beeinflusst werden.
Ebenso ist die Rolle der Flags beschrieben.

Es gibt kein vielleicht. Entweder ein Flag wird auf 0 oder 1 gesetzt, 
oder eben nicht.
Wenn du den Trick mit SUBB, resp ADC begriffen hast, bist du einen 
Schritt weiter.

von Mc M. (mcmix)


Lesenswert?

Peter D. schrieb:
> Es geht auch ohne:
> 1.  add a, #-Wert
>   jz gleich
>   jc groesser

und das funktioniert als Vergleich?

von (prx) A. K. (prx)


Lesenswert?

Wilhelm S. schrieb:
> und das funktioniert als Vergleich?

Wieso nicht? Subtraktion ist mathematisch identisch mit der Addition des 
negierten Wertes: a-b = a+(-b). Nur das Carry ist invers, weil die 
Subtraktion des 8051 ein echtes Borrow liefert. Muss man sich als 
Asm-Programmierer nur dran gewöhnen, dass ADD A,#-x ein inverses Carry 
liefert, gegenüber CLR C; SUBB A,#x.

: Bearbeitet durch User
von H-G S. (haenschen)


Lesenswert?

Tut mir leid aber das überfordert im Moment mein Gehirn :-)

Ich werde einfach das Carry löschen bevor ich subtrahiere!
Ich muss eh den Code neu schreiben und umwandeln da ich 2 NOPs drinhabe 
die ich noch rausbringen muss.


Edit: Visualisierungen würden wirklich helfen, dieses im-Kopf-vorstellen 
schmerzt bisweilen ...

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

H-G S. schrieb:
> Tut mir leid aber das überfordert im Moment mein Gehirn :-)

Ein Simulator wirkt bei sowas Wunder.
Der 8051 ist jetzt nicht so seltsam, dass es keinen gäbe...

von Mc M. (mcmix)


Lesenswert?

A. K. schrieb:
> Wilhelm S. schrieb:
>> und das funktioniert als Vergleich?
>
> Wieso nicht? Subtraktion ist mathematisch identisch mit der Addition des
> negierten Wertes: a-b = a+(-b). Nur das Carry ist invers, weil die
> Subtraktion des 8051 ein echtes Borrow liefert. Muss man sich als
> Asm-Programmierer nur dran gewöhnen, dass ADD A,#-x ein inverses Carry
> liefert, gegenüber CLR C; SUBB A,#x.

Ich habe einfach das - Zeichen überlesen.
So ist das klar,
Danke! :-)

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.