Also erstmal grundsätzliches:
Die AVR arbeiten binär, wenn das Komma nach rechts geschoben wird (bzw die Zahl nach Links) wird verdoppelt, wenn es nach links geschoben wird (bzw die Zahl nach rechts) wird halbiert. Basis Zwei.
Im Dezimalsystem (Basis Zehn) verzehnfachst/zehntelst Du genauso.
Wenn Du (analog zu Deinem binären Problem) dezimal die ... Sagen wir 1287651 durch 10000 teilen solltest, würdest Du einfach das Komma vier Stellen nach links schieben (bzw die Zahl selbst viermal eine Stelle nach Rechts).
Ergäbe 128,7651.
Was bedeutet das mit den Nachkommastellen nun? Die "7" sind sieben zehntel (also 7*10
-1), die "6" sechs hundertstel (also 6*10
-2) usw.
Binär ist es genau dasselbe, nur eben auf Basis Zwei.
Um durch sechzehn zu teilen, schiebst Du die Zahl viermal nach rechts. Als Beispiel einfach mal die 450dez.
Wäre binär 111000010
Komma um vier Stellen verschoben: 11100,0010
11100binär entspricht 28dezimal.
und 0,001binär ist "null halbe" plus "null viertel" plus "ein achtel"
also 11100,0010binär ist 28 und einachtel ... 28,128 dezimal.
Um ein Byte durch sechzehn zu teilen, müßte also viermal geschoben werden. Das dabei jeweils ins Carry fallende letzte Bit müßte je in ein Nachkommabyte gerollt werden (ignorieren wir mal das neunte Bit):
11000010 -LSR-> 01100001 Carry=0, ROR->0
01100001 -LSR-> 00110000 Carry=1, ROR->10
00110000 -LSR-> 00011000 Carry=0, ROR->010
00011000 -LSR-> 00001100 Carry=0, ROR->0010
Erfordert acht Instruktionen. Viermal je ein Shift und ein Rotate. Das neunte Bit bräuchte ein weiters Byte, also je ein weiteres Rotate - zusammen 12 Instruktionen.
Ok, soweit die stupide Rechnung - jetzt zu den Tricks.
Nach den vier Shifts/Rotates befinden sich die vier vorher linken Bits rechts im selben Byte, und die vier vorher rechten links in einem anderen Byte.
Der AVR kann die Nibbles eines Bytes mit einer Instruktion tauschen - SWAP
Aus 11000010 wird 00101100.
Das wird in das Nachkommabyte kopiert (MOV)
Also 00101100 00101100.
Jetzt werden im Vorkommabyte die ersten vier, und im Nachkommabyte die letzten vier Bits wegmaskiert. Je mit ANDI.
Ergibt 0000110 00100000.
Fertig nach vier (statt acht) Instruktionen.
Ok, und mit neun Bits (bis max 12 Bits)?
CodeBox Assembler
;verwendet werden drei Register HByte, Lbyte und Nachkommabyte
SWAP Lbyte ;Nibbles tauschen
MOV Nachkommabyte, Lbyte ;Kopieren
ANDI Nachkommabyte, 0xF0 ;unteres Nibble im Nachkommabyte löschen
ANDI Lbyte, 0x0F ;dito oberes Nibble im Lbyte
SWAP Hbyte ;unteres Nibble nach oben tauschen
ADD Lbyte, Hbyte ;und auf Lbyte addieren
Fertig nach sechs (statt zwölf) Instruktionen.
Was meintest Du jetzt mit "ausgeben"?