Pfad: Home => AVR-Übersicht => Binäres Rechnen => Multiplikation

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


©2002 by http://www.avr-asm-tutorial.net