HiTech
17.11.2003, 01:57
Beispiel-Assemblercode:
Assembler Quelltext der Multiplikation
; Mult8.asm multipliziert zwei 8-Bit-Zahlen
; zu einem 16-Bit-Ergebnis
;
.NOLIST
.INCLUDE "C:\avrtools\appnotes\8515def.inc"
.LIST
;
; Ablauf des Multiplizierens:
;
; 1.Multiplikator 2 wird bitweise nach rechts in das
; Carry-Bit geschoben. Wenn es eine Eins ist, dann
; wird die Zahl in Multiplikator 1 zum Ergebnis dazu
; gezählt, wenn es eine Null ist, dann nicht.
; 2.Nach dem Addieren wird Multiplikator 1 durch Links-
; schieben mit 2 multipliziert.
; 3.Wenn Multiplikator 2 nach dem Schieben nicht Null
; ist, dann wird wie oben weiter gemacht. Wenn er Null
; ist, ist die Multplikation beendet.
;
; Benutzte Register
;
.DEF rm1 = R0 ; Multiplikator 1 (8 Bit)
.DEF rmh = R1 ; Hilfsregister für Multiplikation
.DEF rm2 = R2 ; Multiplikator 2 (8 Bit)
.DEF rel = R3 ; Ergebnis, LSB (16 Bit)
.DEF reh = R4 ; Ergebnis, MSB
.DEF rmp = R16 ; Hilfsregister zum Laden
;
.CSEG
.ORG 0000
;
rjmp START
;
START:
ldi rmp,0xAA ; Beispielzahl 1010.1010
mov rm1,rmp ; in erstes Multiplikationsreg
ldi rmp,0x55 ; Beispielzahl 0101.0101
mov rm2,rmp ; in zweites Multiplikationsreg
;
; Hier beginnt die Multiplikation der beiden Zahlen
; in rm1 und rm2, das Ergebnis ist in reh:rel (16 Bit)
;
MULT8:
;
; Anfangswerte auf Null setzen
clr rmh ; Hilfsregister leeren
clr rel ; Ergebnis auf Null setzen
clr reh
;
; Hier beginnt die Multiplikationsschleife
;
MULT8a:
;
; Erster Schritt: Niedrigstes Bit von Multplikator 2
; in das Carry-Bit schieben (von links Nullen nachschieben)
;
clc ; Carry-Bit auf Null setzen
ror rm2 ; Null links rein, alle Bits eins rechts,
; niedrigstes Bit in Carry schieben
;
; Zweiter Schritt: Verzweigen je nachdem ob eine Null oder
; eine Eins im Carry steht
;
brcc MULT8b ; springe, wenn niedrigstes Bit eine
; Null ist, über das Addieren hinweg
;
; Dritter Schritt: Addiere 16 Bits in rmh:rm1 zum Ergebnis
; in reh:rel (mit Überlauf der unteren 8 Bits!)
;
add rel,rm1 ; addiere LSB von rm1 zum Ergebnis
adc reh,rmh ; addiere Carry und MSB von rm1
;
MULT8b:
;
; Vierter Schritt: Multipliziere Multiplikator rmh:rm1 mit
; Zwei (16-Bit, links schieben)
;
clc ; Carry bit auf Null setzen
rol rm1 ; LSB links schieben (multiplik. mit 2)
rol rmh ; Carry in MSB und MSB links schieben
;
; Fünfter Schritt: Prüfen, ob noch Einsen im Multi-
; plikator 2 enthalten sind, wenn ja, dann weitermachen
;
tst rm2 ; alle bits Null?
brne MULT8a ; wenn nicht null, dann weitermachen
;
; Ende der Multiplikation, Ergebnis in reh:rel
;
; Endlosschleife
;
LOOP:
rjmp loop
Assembler Quelltext der Multiplikation
; Mult8.asm multipliziert zwei 8-Bit-Zahlen
; zu einem 16-Bit-Ergebnis
;
.NOLIST
.INCLUDE "C:\avrtools\appnotes\8515def.inc"
.LIST
;
; Ablauf des Multiplizierens:
;
; 1.Multiplikator 2 wird bitweise nach rechts in das
; Carry-Bit geschoben. Wenn es eine Eins ist, dann
; wird die Zahl in Multiplikator 1 zum Ergebnis dazu
; gezählt, wenn es eine Null ist, dann nicht.
; 2.Nach dem Addieren wird Multiplikator 1 durch Links-
; schieben mit 2 multipliziert.
; 3.Wenn Multiplikator 2 nach dem Schieben nicht Null
; ist, dann wird wie oben weiter gemacht. Wenn er Null
; ist, ist die Multplikation beendet.
;
; Benutzte Register
;
.DEF rm1 = R0 ; Multiplikator 1 (8 Bit)
.DEF rmh = R1 ; Hilfsregister für Multiplikation
.DEF rm2 = R2 ; Multiplikator 2 (8 Bit)
.DEF rel = R3 ; Ergebnis, LSB (16 Bit)
.DEF reh = R4 ; Ergebnis, MSB
.DEF rmp = R16 ; Hilfsregister zum Laden
;
.CSEG
.ORG 0000
;
rjmp START
;
START:
ldi rmp,0xAA ; Beispielzahl 1010.1010
mov rm1,rmp ; in erstes Multiplikationsreg
ldi rmp,0x55 ; Beispielzahl 0101.0101
mov rm2,rmp ; in zweites Multiplikationsreg
;
; Hier beginnt die Multiplikation der beiden Zahlen
; in rm1 und rm2, das Ergebnis ist in reh:rel (16 Bit)
;
MULT8:
;
; Anfangswerte auf Null setzen
clr rmh ; Hilfsregister leeren
clr rel ; Ergebnis auf Null setzen
clr reh
;
; Hier beginnt die Multiplikationsschleife
;
MULT8a:
;
; Erster Schritt: Niedrigstes Bit von Multplikator 2
; in das Carry-Bit schieben (von links Nullen nachschieben)
;
clc ; Carry-Bit auf Null setzen
ror rm2 ; Null links rein, alle Bits eins rechts,
; niedrigstes Bit in Carry schieben
;
; Zweiter Schritt: Verzweigen je nachdem ob eine Null oder
; eine Eins im Carry steht
;
brcc MULT8b ; springe, wenn niedrigstes Bit eine
; Null ist, über das Addieren hinweg
;
; Dritter Schritt: Addiere 16 Bits in rmh:rm1 zum Ergebnis
; in reh:rel (mit Überlauf der unteren 8 Bits!)
;
add rel,rm1 ; addiere LSB von rm1 zum Ergebnis
adc reh,rmh ; addiere Carry und MSB von rm1
;
MULT8b:
;
; Vierter Schritt: Multipliziere Multiplikator rmh:rm1 mit
; Zwei (16-Bit, links schieben)
;
clc ; Carry bit auf Null setzen
rol rm1 ; LSB links schieben (multiplik. mit 2)
rol rmh ; Carry in MSB und MSB links schieben
;
; Fünfter Schritt: Prüfen, ob noch Einsen im Multi-
; plikator 2 enthalten sind, wenn ja, dann weitermachen
;
tst rm2 ; alle bits Null?
brne MULT8a ; wenn nicht null, dann weitermachen
;
; Ende der Multiplikation, Ergebnis in reh:rel
;
; Endlosschleife
;
LOOP:
rjmp loop