>Ich weiß der INC-Befehl beeinflußt
>zusätzlich zum ADD-Befehl nicht die Flags H und C.
Genau, das ist der wesentliche Unterschied, der die clevere Verwendung
von inc und dec als Loop-Counter ermöglicht.
Im Artikel AVR-Arithmetik finden sich einige Codes, in denen davon
Gebrauch gemacht wird, darunter die 16-Bit-mal-32-Bit-Multiplikation.
Der letzte Teil der Routine sieht so aus:
1 | _umu1: ldi i0, 16
|
2 | clr t0
|
3 | clr t1
|
4 | ror a1
|
5 | ror a0
|
6 | _umu2: brcc _umu3
|
7 | add a2, b0
|
8 | adc a3, b1
|
9 | adc t0, b2
|
10 | adc t1, b3
|
11 | _umu3: ror t1
|
12 | ror t0
|
13 | ror a3
|
14 | ror a2
|
15 | ror a1
|
16 | ror a0
|
17 | dec i0
|
18 | brne _umu2
|
19 | ret
|
Das Stück zwischen dem Label "_umu2" und ret ist eine Schleife mit i0
als Loop-Counter. Sie wird 16 mal durchlaufen. Jeder ror-Befehl setzt
das C-Flag, aber das "dec i0" in der drittletzten Zeile wirkt sich
nicht darauf aus. Dadurch bleibt der Zustand des C-Flags für den
nächsten Schleifendurchlauf erhalten, und das ist genau das, was man
sich wünscht. Zum Testen, ob die Schleife verlassen werden kann, wird
das Z-Flag herangezogen (brne in der vorletzten Zeile). Das
funktioniert, weil das Z-Flag einerseits von dec gesetzt wird, und
andererseits nirgendwo sonst eine Bedeutung hat. Beim C-Flag ist es
genau umgekehrt.
http://www.mikrocontroller.net/articles/AVR_Arithmetik#16_Bit_.2B_16_Bit