Path: Home => AVR-Overview => Binary calculations => multiplication

; Mult8.asm multiplies two 8-bit-numbers
; to yield a 16-bit-result
;
.NOLIST
.INCLUDE "C:\avrtools\appnotes\8515def.inc"
.LIST
;
; Flow of multiplication
;
; 1.The binary to be multiplicated with, is shifted bitwise
;   into the carry bit. If it is a one, the binary number
;   is added to the result, if it is not a one that was
;   shifted out, the number is not added
; 2.The binary number is multiplied by 2 by rotating it
;   one position left, shifting a 0 into the void position.
; 3.If the binary to be multiplied with, is not zero, the
;   multiplication loop is repeated. If it is zero, the
;   multiplication is done.
;
; Used registers
;
.DEF rm1 = R0 ; Binary number to be multiplicated (8 Bit)
.DEF rmh = R1 ; Interim storage
.DEF rm2 = R2 ; Binary number to be multiplicated with (8 Bit)
.DEF rel = R3 ; Result, LSB (16 Bit)
.DEF reh = R4 ; Result, MSB
.DEF rmp = R16 ; Multi purpose register for loading
;
.CSEG
.ORG 0000
;
	rjmp START
;
START:
	ldi rmp,0xAA ; example binary 1010.1010
	mov rm1,rmp  ; to the first binary register
	ldi rmp,0x55 ; example binary 0101.0101
	mov rm2,rmp  ; to the second binary register
;
; Here we start with the multiplication of the two binaries
; in rm1 und rm2, the result will go to reh:rel (16 Bit)
;
MULT8:
;
; Clear start values
	clr rmh ; clear interim storage
	clr rel ; clear result registers
	clr reh
;
; Here we start with the multiplication loop
;
MULT8a:
;
; Step 1: Rotate lowest bit of binary number 2 to the carry
;         flag (divide by 2, rotate a zero into bit 7)
;
	clc ; clear carry bit
	ror rm2 ; bit 0 to carry, bit 1 to 7 one position to
	        ; the right, carry bit to bit 7
;
; Step 2: Branch depending if a 0 or 1 has been rotated to
;         the carry bit
;
	brcc MULT8b ; jump over adding, if carry has a 0
;
; Step 3: Add 16 bits in rmh:rml to the result, with overflow
;         from LSB to MSB
;
	add rel,rm1 ; add LSB of rm1 to the result
	adc reh,rmh ; add carry and MSB of rm1
;
MULT8b:
;
; Step 4: Multiply rmh:rm1 by 2 (16 bits, shift left)
;
	clc ; clear carry bit
	rol rm1 ; rotate LSB left (multiply by 2)
	rol rmh ; rotate carry into MSB and MSB one left
;
; Step 5: Check if there are still one's in binary 2, if
;         yes, go on multiplicating
;
	tst rm2 ; all bits zero?
	brne MULT8a ; if not, go on in the loop
;
; End of the multiplication, result in reh:rel
;
; Endless loop
;
LOOP:
	rjmp loop


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