# 8051 Assembly - Multiplying a 16 - bit number with an 8 - bit number

Page 1 of 1

## 0 Replies - 1661 Views - Last Post: 17 July 2008 - 08:50 AM

### #1 Louisda16th

• dream.in.assembly.code

Reputation: 15
• Posts: 1,967
• Joined: 03-August 06

# 8051 Assembly - Multiplying a 16 - bit number with an 8 - bit number

Posted 17 July 2008 - 08:50 AM

Description: Run the program in an 8051 simulator.The program shows how you can handle numbers larger than the microcontroller's wordsize i.e. 8 bits.
```;Multiplying a 16 bit number by an 8 bit number.
;Lets look at a normal multiplication first:
;Consider 19 x 12
;First multiply 12 by the least significant digit.
;		12 x 9 = 108 	Take 10 as a carry since it exceeds the number of digits in "9" i.e. 1
;						and keep 8 as the least significant digit of the answer
;Now multiply 12 by the most significant digit.
;		12 x 1 = 12.
;And add the carry to this
;		12 + 10 = 22
; Therefore the answer becomes 228.
;Now lets look at this in hex. Consider AABB x CC
;-----------------------STEP ONE---------------------------------------------------
;		BB x CC = 9504  	Keep 95 as carry and 04 as the lower byte (not bit or nibble)
;----------------------STEP TWO----------------------------------------------------
;		AA x CC = 8778
;----------------------STEP THREE--------------------------------------------------
;		8778 + 95 = 880D	Remember that you are adding a 16bit number and an 8bit number.
;							So addition will take two steps.
;Input is in 9000h to 9002h
;Output is in 9100h to 9102h
;----------------------------Get the Input--------------------
ORG 00H
MOV DPTR, #9000h	;Data is stored from location 9000h onwards
MOVX A, @DPTR		;Get the higher byte of the 16 - bit number
MOV R0, A			;and store it in R0
INC DPTR			;Move to the next memory location
MOVX A, @DPTR		;Get the lower byte of the 16 - bit number
MOV R1, A			;and store it in R1
INC DPTR			;Move to the next memory location.
MOVX A, @DPTR		;Get the 8 - bit number
MOV R2, A			;and store it in R2

;---Do the Multiplication and Store the Output at Each Step---
MOV DPTR, #9100h	;Start storing the answers from here
;Least siginificant byte goes first so the bytes
;of the answer will be in reverse order.

;STEP ONE of the above explanation:
MOV A, R1			;Get the lower byte and store it in the accumulator
MOV B, R2			;Get the 8-bit number.
MUL AB				;Multiply the two
MOVX @DPTR, A		;Store the lower byte in the external memory. The higher byte
;which is in the B register is the carry. (see step one again if unclear)
MOV R3, B			;Store the carry in register B
;STEP TWO of the above explanation
MOV A, R0			;Get the lower byte and store it in the accumultor.
MOV B, R2			;Get the 8-bit number
MUL AB				;Multiply them.

;STEP THREE of the above explanation:
INC DPTR			;Mov to next memory location
MOVX @DPTR, A		;Store the second byte of the final answer in the external memory.
MOV A, B			;Put the higher byte of the answer of step two in accumulator.
ADDC A, #00h		;This step adds a carry to the higher byte. We just need to add a carry so
;we add 0 to the higher byte with carry if a carry was generated from the
INC DPTR			;Move to the next memory location.
MOVX @DPTR, A 		;Store the final result.

Here: SJMP Here
END
;----------------------------------------------------------------
```

Is This A Good Question/Topic? 0

Page 1 of 1

 .related ul { list-style-type: circle; font-size: 12px; font-weight: bold; } .related li { margin-bottom: 5px; background-position: left 7px !important; margin-left: -35px; } .related h2 { font-size: 18px; font-weight: bold; } .related a { color: blue; }