8051 größer als Test: Carry vorher löschen ?

OP #4857485
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 ?
#4857547
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.
#4857591
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.
Gast #4857600
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.
OP #4858798
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 ...
#4858887
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

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