8086 Program to unpack the packed BCD number



ØØ       Explanation :
·            A digit BCD number is available in register AL. We have to unpack this BCD number i.e. we have to separate the BCD digits. e.g : If the number = 92 H then in unpack form the two digits will 02 H and 09 H. i.e. we have to mask the lower nibble, first and rotate four times to the right to get the MSB digit. Then to get the LSB digit mask the upper nibble. Display the result. Masking lower nibble means ANDing the number with OF0 to get MSB.


ØØ       Algorithm :
Step I         :   Initialize the data memory.
Step II        :   Load number into register AL.
Step III      :   Mask the lower nibble.
Step IV      :   Rotate 4 times left to make
                    ;   MSB digit = LSB.
Step V        :   Display the digit.
Step VI      :   Load number in AL.
Step VII     :   Mask upper nibble.
Step VIII   :   Display the result.
Step IX      :   Stop.
ØØ       Flowchart : Refer flowchart 6.

ØØ       Program :
.model small
.data
a db 92H    
.code
       mov     ax, @data      ; Initialize data section
       mov     ds, ax
       mov     al, a              ; Load number1 in al
       and      al, 0f0h         ; mask lower nibble
       rcr       al, 4             ; rotate it 4 times to right to make it 09h
       mov     bh, al            ; store result in bh
       call      disp              ; display the upper nibble
       mov     al, a              ; Load number1 in al
       and      al, 0fh           ; mask upper nibble
       mov     bh, al            ; store result in bh
       call      disp              ; display the lower nibble
       mov     ah, 4cH         ; Terminate Program
       int       21H 
disp  proc near
       mov     ch, 02h         ; Count of digits to be displayed
       mov     cl, 04h ; Count to roll by 4 bits
l2:    rol       bh, cl            ; roll bl so that msb comes to lsb
       mov     dl, bh           ; load dl with data to be displayed
       and      l, 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, 02h
       mov     dl, ' '
       int       21h
       endp
ret
      end
ØØ       Result :
C:\programs>tasm unpack.asm
Turbo Assembler  Version 3.0  Copyright (c) 1988, 1991 Borland International
Assembling file:   unpack.asm
Error messages:    None
Warning messages:  None
Passes:            1
Remaining memory:  437k
C:\programs>tlink unpack
Turbo Link  Version 3.0 Copyright (c) 1987, 1990 Borland International
Warning: No stack
C:\programs>unpack
09 02

C:\programs>