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. 87<br />
Die Multiplikation einer Zahl mit 2 geht einfach so vor sich, dass alle Bits einer binären Zahl um eine<br />
Stelle nach links geschoben wer<strong>de</strong>n. In das freie Bit 0 kommt eine Null. Das überzählige ehemalige<br />
Bit 7 wird dabei in das Carry-Bit im Status-Register abgeschoben. Der Vorgang wird logisches<br />
Links-Schieben genannt.<br />
LSL R1<br />
Das umgekehrte Dividieren durch 2 heißt Dividieren o<strong>de</strong>r logisches Rechts-Schieben.<br />
LSR R1<br />
Dabei wird das frei wer<strong>de</strong>n<strong>de</strong> Bit 7 mit einer 0 gefüllt, während das Bit 0 in das Carry geschoben<br />
wird. Dieses Carry kann dann zum Run<strong>de</strong>n <strong>de</strong>r Zahl verwen<strong>de</strong>t wer<strong>de</strong>n. Als Beispiel wird eine Zahl<br />
durch vier dividiert und dabei gerun<strong>de</strong>t.<br />
Div2:<br />
DivE:<br />
LSR R1 ; Division durch 2<br />
BRCC Div2 ; Springe wenn kein Run<strong>de</strong>n<br />
INC R1 ; Aufrun<strong>de</strong>n<br />
LSR R1 ; Noch mal durch 2<br />
BRCC DivE ; Springe wenn kein Run<strong>de</strong>n<br />
INC R1 ; Aufrun<strong>de</strong>n<br />
Teilen ist also eine einfache Angelegenheit bei Binärzahlen (aber nicht durch 3 o<strong>de</strong>r 5)!<br />
Bei Vorzeichen-behafteten Zahlen wür<strong>de</strong> das Rechtsschieben das Vorzeichen in Bit 7 übel verän<strong>de</strong>rn.<br />
Das darf nicht sein. Des<strong>de</strong>wegen gibt es neben <strong>de</strong>m logischen Rechtsschieben auch das arithmetische<br />
Rechtsschieben. Dabei bleibt das Vorzeichenbit 7 erhalten und die Null wird in Bit 6 eingeschoben.<br />
ASR R1<br />
Wie beim logischen Schieben lan<strong>de</strong>t das Bit 0 im Carry.<br />
Wie nun, wenn wir 16-Bit-Zahlen mit 2 multiplizieren wollen? Dann muss das links aus <strong>de</strong>m untersten<br />
Byte herausgeschobene Bit von rechts in das oberste Byte hineingeschoben wer<strong>de</strong>n. Das erledigt<br />
man durch Rollen. Dabei lan<strong>de</strong>t keine Null im Bit 0 <strong>de</strong>s verschobenen Registers, son<strong>de</strong>rn <strong>de</strong>r<br />
Inhalt <strong>de</strong>s Carry-Bits.<br />
LSL R1 ; Logische Schieben unteres Byte<br />
ROL R2 ; Linksrollen <strong>de</strong>s oberen Bytes<br />
Bei <strong>de</strong>r ersten Instruktion gelangt Bit 7 <strong>de</strong>s unteren Bytes in das Carry-Bit, bei <strong>de</strong>r zweiten Instruktion<br />
dann in Bit 0 <strong>de</strong>s oberen Bytes. Nach <strong>de</strong>r zweiten Instruktion hängt Bit 7 <strong>de</strong>s oberen Bytes im<br />
Carry-Bit herum und wir könnten es ins dritte Byte schieben, usw. Natürlich gibt es das Rollen auch<br />
nach rechts, zum Dividieren von 16-Bit-Zahlen gut geeignet. Hier nun alles Rückwärts:<br />
LSR R2 ; Oberes Byte durch 2, Bit 0 ins Carry<br />
ROR R1 ; Carry in unteres Byte und dabei rollen<br />
So einfach ist das mit <strong>de</strong>m Dividieren bei großen Zahlen. Man sieht sofort, dass Assembler-Dividieren<br />
viel schwieriger zu erlernen ist als Hochsprachen-Dividieren, o<strong>de</strong>r?<br />
Gleich vier mal Spezial-schieben kommt jetzt. Es geht um die Nibble gepackter BCD-Zahlen. Wenn