ADJUSTMENT INSTRUCTION
OBJECTIVES:
- To study the 8086 instruction for ASCII and decimal adjustment for addition and subtraction.
- To study the 8086 instruction for adjustment of multiplication and division of unpacked BCD numbers
INSTRUCTION:
ASCII and Packed Decimal Arithmetic:When ASCII digits are added, the AAA( ASCII adjust after addition) instruction converts the binary result to BCD format. AAS performs the same operations after subtraction and AAM is used after multiplication. AAD (ASCII adjust before division) modifies AX before division takes place. All of this instruction is valid only for 8-bit operations.
Two instructions adjust the result of packed decimal operation. The DAA (decimal adjust after addition) instruction adjust the contents of AL after 8-bit addition or subtraction, respectively
EXPERIMENT:
There are four parts of this experiment, each containing a relatively smaller program. It will be convenient for you to put the main body of the program in the program template defined earlier in experiment 4. This will help you save time writing four times the common MASM directives and initialization instructions.
Part-1 :
The following program is taken from chapter 8 of [1]. Writes it in a text editor, assemble, and link it, and then load it in DEBUG. Trace the program, and note down the contents of AL before and after the execution of AAA instruction, each time it is executed. Try the program for some other values of two input operands.Page, 132
Title ASCII Decimal Addition
dosseg
.model small
.stack 100h
numdigits equ 8 ; number of digit
.code
comment # Demonstration of ASCII addition using two 8-digit strings
The AAA instruction adjusts the result after each addition#.
main proc
mov ax @data ; initialize the DS register
mov ds,ax
mov cx, numdigits ; set loop counter
mov si, numdigits¬_1 ; point SI to first digit
mov ax, 0 ; initialize AX
next_digit :
mov al, val1[si] ; get digit from val1
add al, ah ; add previous carry
mov ah,0
add al, val2[si] ; add digit from val2
aaa ; AX= adjusted result
; AH contains carry if an y
or al,30h ; convert digit to ASCII
mov result[si], al ; store digit in result
dec si
dec cx
jnz next_digit ; back up the index
mov ax, 4C00h
int 21 h
main endp
.data
val1 db ‘09999999’ ; input operand
val2 db ‘09999999’ ; input operand
result db numdigits dup(0) ; result ‘19999998’
end main
Note : We have used a new assembler directive and a new member operator in the program They are
1. EQU Directive: It assigns a symbolic name to a string or numeric constant. This increase the readability of a program and makes it possible to change constant in a single place at the beginning of a program .
2. DUP Operator: It repeats a single- or multiple byte value. For example, 20 bytes containing all binary zeros would be coded as : db 20 dup ( 0)
Part –II:
The following program adds two 9-byte packed BCD numbers. Refer to chapter 8 of [1]. Trace it with DEBUG and note down the contents of AL both before and after the DAA instruction, each time it is executed check the AC and C flages as well.Page, 132
title packed decimal addition
dosseg
.model small
.stack 100 h
.code
numbytes equ 9 ; number of bytes to be added
main proc
mov ax. @data ; initialize the DS register
mov dx,ax
mov cx, numbytes ;
mov si, numbytes_1 ; start at lowest digit
clc ; clear carry flag
next_digit:
mov al, val1 [si] ; get digit from val1
adc al, val2 [si] ; add digit from val2 + carry
daa ; AL contains adjusted result
mov result [si] ; store the digit
dec si ; point to next byte
loop next_digit
mov ax, 4c00h
int 21h
main endp
data ; variables here
val1 db 09h,87h,65h,43h,87h46h,69h, 83h,76h
val2 db 00h,08h,76h,54h,32h,72h,84h,05h
result db numbytes dup (0)
end main
Note: The ‘loop’ instruction decrements CX register and jumps to a short label if CX is greater that zero. The short label must be in the range- 128 to + 127 bytes from the next instruction
Part-III:
The following program contains adjustment instruction for subtraction. Trace it in DEBUG, and note down the constants of AL and status flags where asked in the comments.Page, 132
title Subtraction
dosseg
.model small
.stack 100 h
.code
main proc
mov ax,@data ; initgialize the DS register
mov ds, ax
mov al,38h ; ASCII for ‘8’
move bl,39h ; ASCII for ‘9’
sub al,bl ; note down
aas ; note down and comment
mov al, 48h ; packed BCD 40
mov bl,85h ; packed BCD85
sub al,bl ; note down
das ; note down
mov ax,4C00h
int 21 h
main endp
.data ; variables here
end main
Part –IV:
The following program contains adjustment instructions for multiplication and division of unpacked BCD numbers. Write the program and load the ‘exe’file in DEBUG, Skip whenever you come across an ‘int 21h’instruction by setting appropriate breakpoint. Try for different input valuesPage, 132.
title Multiplication and Division
dosseg
.model small
.stack 100h
.code
main proc
mov ax, @data ; initialize the DS register
mov da,ax
Comment # note down the constants of AX before and after the execution of AAM instruction #
mov ah,01h ; inpute mode
int 21h ; get multiplicand in AL
and al, 0fh ; make it unpacked BCD
mov bl,al ; save in BI
int 21h ; get multiplier
and al,ofh ; make it unpacked BCD
nul bl ; multiply the two numbers
aam ; ASCII adjust after
; multiplication
comment # Note down the contents of AX before and after the execution of AAD instruction # .
move ah,01h ; inpute mode
int 21 h ; get divisor in AL
and al ,0fh ; make it unpacked BCD
move bl,al ; save in BL
int 21 h ; get MS digit of dividend
and al,ofh ; make it unpacked BCD
move bh,al ; save in BH
int 21h ; get LS digit of dividend
move al,0fh ; make it unpacked BCD
mov ah, bh ; now AX contains the dividend
; concerts to hex
aad ; adjustment before division
div bl
mov ax,4C00h
int 21h
main endp
.data ; variables here
end main
REFERENCES:
- Kip R. Irvine. Assembly Language for the IBM-PC Macmillan Publishing Company, 1990.
0 comments:
Post a Comment