beginner_de
beginner_de
beginner_de
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Avr-Asm-Tutorial S. 97<br />
Binäres Dividieren<br />
Binär entfällt wie<strong>de</strong>r das Multiplizieren <strong>de</strong>s Divisors (4 * 1200, etc.), weil es nur Einsen und Nullen<br />
gibt. Dafür haben binäre Zahlen lei<strong>de</strong>r sehr viel mehr Stellen als <strong>de</strong>zimale. Die direkte Analogie wäre<br />
in diesem Fall etwas aufwändig, weshalb die rechentechnische Lösung etwas an<strong>de</strong>rs aussieht.<br />
Die Division einer 16-Bit-Zahl durch eine 8-Bit-Zahl in AVR Assembler ist hier als Quellco<strong>de</strong> gezeigt.<br />
Assembler Quellco<strong>de</strong> <strong>de</strong>r Division<br />
; Div8 dividiert eine 16-Bit-Zahl durch eine 8-Bit-Zahl<br />
; Test: 16-Bit-Zahl: 0xAAAA, 8-Bit-Zahl: 0x55<br />
.NOLIST<br />
.INCLUDE "C:\avrtools\appnotes\8515<strong>de</strong>f.inc"<br />
.LIST<br />
; Registers<br />
.DEF rd1l = R0 ; LSB Divi<strong>de</strong>nt<br />
.DEF rd1h = R1 ; MSB Divi<strong>de</strong>nt<br />
.DEF rd1u = R2 ; Hifsregister<br />
.DEF rd2 = R3 ; Divisor<br />
.DEF rel = R4 ; LSB Ergebnis<br />
.DEF reh = R5 ; MSB Ergebnis<br />
.DEF rmp = R16; Hilfsregister zum La<strong>de</strong>n<br />
.CSEG<br />
.ORG 0<br />
rjmp start<br />
start:<br />
; Vorbelegen mit <strong>de</strong>n Testzahlen<br />
ldi rmp,0xAA ; 0xAAAA in Divi<strong>de</strong>nt<br />
mov rd1h,rmp<br />
mov rd1l,rmp<br />
ldi rmp,0x55 ; 0x55 in Divisor<br />
mov rd2,rmp<br />
; Divieren von rd1h:rd1l durch rd2<br />
div8:<br />
clr rd1u ; Leere Hilfsregister<br />
clr reh ; Leere Ergebnisregister<br />
clr rel ; (Ergebnisregister dient auch als<br />
inc rel ; Zähler bis 16! Bit 1 auf 1 setzen)<br />
; Hier beginnt die Divisionsschleife<br />
div8a:<br />
clc ; Carry-Bit leeren<br />
rol rd1l ; nächsthöheres Bit <strong>de</strong>s Divi<strong>de</strong>nten<br />
rol rd1h ; in das Hilfsregister rotieren<br />
rol rd1u ; (entspricht Multipliklation mit 2)<br />
brcs div8b ; Eine 1 ist herausgerollt, ziehe ab<br />
cp rd1u,rd2 ; Divisionsergebnis 1 o<strong>de</strong>r 0?<br />
brcs div8c ; Überspringe Subtraktion, wenn kleiner<br />
div8b:<br />
sub rd1u,rd2; Subtrahiere Divisor<br />
sec ; Setze carry-bit, Ergebnis ist eine 1<br />
rjmp div8d ; zum Schieben <strong>de</strong>s Ergebnisses<br />
div8c:<br />
clc ; Lösche carry-bit, Ergebnis ist eine 0<br />
div8d:<br />
rol rel ; Rotiere carry-bit in das Ergebnis<br />
rol reh<br />
brcc div8a ; solange Nullen aus <strong>de</strong>m Ergebnis<br />
; rotieren: weitermachen<br />
; En<strong>de</strong> <strong>de</strong>r Division erreicht<br />
stop:<br />
rjmp stop ; Endlosschleife