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
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.
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 |
Es scheint komplizierter als gedacht! In dem Programmier-Manual stand das im Bild angehängte :-)
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
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 ?
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.
A. K. schrieb: > Komplizierter ist nur, dass es dein gewünschtes SUBB A,#Wert nicht gibt, Meinte SUB A,#Wert.
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 ...
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.
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.
Peter D. schrieb: > Es geht auch ohne: > 1. add a, #-Wert > jz gleich > jc groesser und das funktioniert als Vergleich?
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
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.