Hallo,
Stehe hier vor einem (ziemlich blöden) Problem... Addition in Assembler,
8-Bit werte sind ja einfach mit ADD und ADC zu berechnen.
Aaaber....
Problem: Ich lese von einem DIP-Schalter einen Wert ein
1
in XL, PinC ;get start address
2
com XL
3
clr XH
4
sbis PinE, PE2 ;9th bit
5
inc XH
Zuerst die ersten 8 Bytes, dann das neunte Byte hinterher. Wert von
0-512.
Und jetzt will ich diesen Wert um die Zahl 8 erhöhen, also wenn vom
Eingang z.B. 20 gelesen werden, soll der Wert dann 28 sein usw...
Irgendwie blick ich da nicht ganz durch, vor allem XL und XH sind mir
nicht ganz klar... bis jetzt sind meine Assemblerkenntnisse noch nicht
so weit, komme eher aus der C-Welt.
Hintergrund des ganzen: den DMX-Demultiplexer (Quellcode ist auch daher)
von hier http://www.hoelscher-hi.de/hendrik/light/demux.htm so
modifizieren, dass die eingestellte Adresse für den Startkanal um 8
verschoben ist.
Hoffe ihr könnt mir mit diesem vermutlich doch recht simplen Problem
helfen!
cyberLink
du kannst recht simpel eine 16 bit-Addition vornehmen:
clc
add operand_1_low, operand_2_low
adc operand_1_high, operand_2_high
was du jetzt davor in die jeweiligen Operanden gespeichert hast, ist ja
deine Sache :-)
Den clc kannst du dir normalerweise sparen.
Der ADD berücksichtigt es sowieso nicht, wenn Carry gesetzt wäre. Drum
gibts ja auch einen ADD und einen ADC
Genau, der AVR kann mit add/adc nur Register addieren.
Ansonsten gäbe es noch ADIW. Das macht genua das was du willst
(Konstante zu 16bit-Zahl addieren), allerdings mit der Einschränkung auf
die letzten vier Registerpaare (R25:R24, X,Y,Z)...
(Wenn eins dieser Registerpaare noch frei ist, kannst du ADIW nehmen.
Wenn nicht, dann bleib ruhig bei der add/adc-Variante. Das ist bloß ein
Befehl mehr im Flash. Schneller ist es nicht, ADIW braucht auch zwei
Takte.)
Wie schon gesagt:
cyberlink schrieb:> Zahl erst in ein Register laden wäre> sinnvoll...> ldi tempL, 8> ldi tempH, 0> clc> add XL, tempL> adc XH, tempH
Habs schon selbst gemerkt dass Konstanten + ADD is nix gut ;-)
Danke nochmal für die schnelle Hilfe!
cyberLink