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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von H-G S. (haenschen)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

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

2.
  cjne a, #wert, ungleich
gleich:

ungleich:
  jc kleiner

von H-G S. (haenschen)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Es scheint komplizierter als gedacht!

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

von A. K. (prx)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 A. K. (prx)


Bewertung
0 lesenswert
nicht 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 A. K. (prx)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 Wilhelm S. (mcmix)


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

und das funktioniert als Vergleich?

von A. K. (prx)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 Wilhelm S. (mcmix)


Bewertung
0 lesenswert
nicht 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! :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.