8086 program to Add two 16 bit BCD numbers
03:29
ØØ Explanation :
·
Consider that two words are available in
registers AX and BX. We have to add these two words.
·
Using add instruction, add the contents, of the
lower two bits i.e. add AL and BL.
·
The result of this addition is stored in the AL
register.
·
DAA instruction is then used to convert the
result to valid BCD. Now, add the contents of MSB alongwith carry if generated
in LSB addition.
·
The result of MSB addition is stored in the AH
register. Adjust this result to valid BCD number. The final result is available
in the BX register.
·
The DAA instruction operates only on the AL
register and so here, we have to add LSB and MSB separately without using ADD
AX, BX.
eg.
: AX = 3629 BCD
BX
= 4738 BCD
Step
I :
|
|
2
|
9
|
|
|
+
|
3
|
8
|
|
|
|
6
|
1
|
and
auxiliary carry = 1
|
As AC = 1, add 6 to make result valid.
61
+ 6 = 67
Step II : 36 + 47 +
0 (Carry of LSB) = 7 D.
Lower
nibble of addition is greater than 9, so add 6.
|
7
|
D
|
+
|
0
|
6
|
|
8
|
3
|
Final
result : 8367 BCD.
ØØ Algorithm :
Step
I : Initialize the data memory.
Step
II : Load
the first number into AX register.
Step
III : Load the second number into BX register.
Step
IV : Add
two lower digits.
Step
V : Adjust
result to valid BCD number.
Step
VI : Store
the result in BL.
Step
VII : Add
the two upper digits with carry.
Step
VIII : Adjust
result to valid BCD number.
Step
IX : Store
the result in BH.
Step
X : Display
the result.
Step
XI : Stop.
ØØ Flowchart : Refer
flowchart
ØØ Program :
.model small
.data
a dw 3629H
b dw 4738H
.code
mov
ax, @data ; Initialize data section
mov
ds, ax
mov
ax, a ;
Load number1 in ax
mov
bx, b ;
Load number2 in bx
add
al, bl ; add lower two digits. Result in al
daa ; adjust result to
valid bcd
mov
bl, al ;
store result in bl
adc
ah, bh ; add upper two digits. Result in ah
mov al, ah ;
al=ah as daa works on al only
daa ; adjust result to
valid BCD
mov
bh, al ;
store result in bh
mov
ch, 04h ; Count of digits to be displayed
mov
cl, 04h ; Count to roll by 4 bits
l2: rol
bx, cl ; roll bl so that msb comes to lsb
mov
dl, bl ;
load dl with data to be displayed
and
dl, 0fH ; get only lsb
cmp
dl, 09 ;
check if digit is 0-9 or letter A-F
jbe
l4
add
dl, 07 ; if letter add 37H else only add 30H
l4: add
dl, 30H
mov
ah, 02 ;
Function 2 under INT 21H (Display character)
int
21H
dec
ch ;
Decrement Count
jnz
l2
mov
ah, 4cH ; Terminate Program
int
21H
end
ØØ Result :
C:\programs>tasm
addbcd16.asm
Turbo
Assembler Version 3.0 Copyright (c) 1988, 1991 Borland
International
Assembling
file: addbcd16.asm
Error
messages: None
Warning
messages: None
Passes: 1
Remaining
memory: 438k
C:\programs>tlink
addbcd16
Turbo
Link Version 3.0 Copyright (c) 1987,
1990 Borland International
Warning: No
stack
C:\programs>addbcd16
8367
C:\programs>
0 comments: