02.05.2013 Aufrufe

beginner_de

beginner_de

beginner_de

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!