Addition / Subtraktion

Moderator: Rockford

Antworten
Benutzeravatar
Dr. Irata
Beiträge: 937
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 268 times
Kontaktdaten:

Addition / Subtraktion

Beitrag von Dr. Irata »

Hallo in die Runde!

Gerade habe ich mich wegen eines Tutorials mit der Addition und Subtraktion beschäftigt und dabei gemerkt, daß es hier tatsächlich noch Dinge gibt, die ich so vorher gar nicht ganz genau wusste. Dies würde ich hier gerne diskutieren und vielleicht können wir auch ein paar schöne Routinen entwickeln, wie man am besten Zahlen addiert und subtrahiert - incl. 16 Bit Zahlen.

Dabei habe ich gleich eine wichtige Frage zum Carry: Wenn ich bei einer Zahl in den Overflow gehe, wird dann das Carry einfach nur komplementiert?
Beispiel: var ist 255 und das Carry ist durch CLC 0 - wenn man nun zu var 1 addiert, geht ja das Carry auf 1... wenn ich vorher das Carry auf 1 setze, geht das dann entsprechend auf 0 ?? Oder bleibt es bei 1??

Gruß
Peter

Dietrich
Beiträge: 74
Registriert: 20.09.2021 20:59
Has thanked: 8 times
Been thanked: 34 times
Kontaktdaten:

Re: Addition / Subtraktion

Beitrag von Dietrich »

ADC und das Carry sind für die Addition beliebig großer Zahlen designt. Es funktioniert wie bei der schriftlichen Addition zweier untereinander notierten Zahlen. Wenn man in einer Spalte einen Übertrag hat, dann ist das Carry gesetzt, sonst nicht.

Also: Nach SEC: LDA #255: ADC #1 ist das Carry gesetzt, da es einen Übertrag gibt. Eigentlich muss man das nicht genau wissen, da die Addition automatisch richtig rechnet. Z.B. kann man zwei 3 Byte große Zahlen (also von 0 bis 256^3-1) einfach so addieren:

clc
lda zahl1
adc zahl2
sta summe
lda zahl1+1
adc zahl2+1
sta summe+1
lda zahl1+2
adc zahl2+2
sta summe+2

Benutzeravatar
Dr. Irata
Beiträge: 937
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 268 times
Kontaktdaten:

Re: Addition / Subtraktion

Beitrag von Dr. Irata »

Hallo,
praktisch ist das vielleicht klar, dennoch möchte ich genau verstehen, was da passiert.

Zunächst ist es ja so, daß der Befehl ADC - add with carry bedeutet. Ein add ohne carry gibt es nicht.

Das Addieren mit möglichem Übertrag geht entsprechend so am einfachsten:

clc
lda var1
adc #10
sta var1
lda var1+1
adc #0
sta var1+1

Beim Overflow geht das Carry auf 1 und im 2. Schritt wird dann das HighByte - var1+1 um 1 erhöht.

Interessant wird es jetzt aber bei der Subtraktion, denn der Befehl SBC subtrahiert den Wert und nicht das Carry, sondern den komplementierten Wert des Carrys.
Man muss also vor jeder Subtraktion zunächst das Carry setzen - also auf 1 und bei der normalen Subtraktion wird dann die entsprechende Zahl von einer anderen abgezogen. Da das Carry bei 1 ist wird dann nichts zusätzlich abgezogen, da ja der Komplementärwert 0 ist... aber wenn die Zahl durch Null geht, was passiert dann mit Carry? Meines Erachtens geht das dann auf Null und wenn ich von var1+1 sbc #0 "abziehe", dann wird var1+1 um 1 reduziert, was ja gewollt ist...
korrekt?

Dietrich
Beiträge: 74
Registriert: 20.09.2021 20:59
Has thanked: 8 times
Been thanked: 34 times
Kontaktdaten:

Re: Addition / Subtraktion

Beitrag von Dietrich »

Genau, das ist vermutlich so, weil die Subtraktion intern wie die Addition des 1er-Komplements (Umdrehen aller Bits) ausgeführt wird. Dann muss man nämlich noch 1 addieren (Carry vorher setzen), um das richtige Ergebnis zu bekommen, z.B. 62-54 = 62+(255-54)+1 (modulo 256). Also muss das Carry vor Beginn der Subtraktion gesetzt sein.
Der Übertrag funktioniert bei der Subtraktion dann so (Beispiel, alles mod 256):
150-160 = 150+(255-160)+1 = 150+95+1 = 246, also kein Additions-Übertrag, somit ist das Carry nach Ausführen dieser Subtraktion gelöscht.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast