Write an assembly language procedure for 8086 microprocessor that divides a 32-bit number by a 16-bit number. The procedure should be written in general, so that it may be defined in one module and can be called in any other module. 10m Jun2006
Large Number Division ;-
J := (K*M)/P
mov ax, K ;Note that the imul instruction produces
imul M ; a 32 bit result in DX:AX, so we don’t
idiv P ; need to sign extend AX here.
mov J, ax ;Hope and pray result fits in 16 bits!
DATA SEGMENT
K DW 7777
M DW 77
P DW 77
J DW ?
RES DB 10 DUP (‘$’)
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AX,K
IMUL M
CALL CHECKCARRY
MOV J,AX
LEA SI,RES
CALL HEX2DEC
LEA DX,RES
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
CHECKCARRY PROC NEAR
IDIV P
RET
CHECKCARRY ENDP
HEX2DEC PROC NEAR
MOV CX,0
MOV BX,10
LOOP1: MOV DX,0
DIV BX
ADD DL,30H
PUSH DX
INC CX
CMP AX,9
JG LOOP1
ADD AL,30H
MOV [SI],AL
LOOP2: POP AX
INC SI
MOV [SI],AL
LOOP LOOP2
RET
HEX2DEC ENDP
END START
[codesyntax]
DATA SEGMENT
K DW 7777
M DW 77
P DW 77
J DW ?
RES DB 10 DUP (‘$’)
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AX,K
IMUL M
CALL CHECKCARRY
MOV J,AX
LEA SI,RES
CALL HEX2DEC
LEA DX,RES
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
CHECKCARRY PROC NEAR
IDIV P
RET
CHECKCARRY ENDP
HEX2DEC PROC NEAR
MOV CX,0
MOV BX,10
LOOP1: MOV DX,0
DIV BX
ADD DL,30H
PUSH DX
INC CX
CMP AX,9
JG LOOP1
ADD AL,30H
MOV [SI],AL
LOOP2: POP AX
INC SI
MOV [SI],AL
LOOP LOOP2
RET
HEX2DEC ENDP
END START
[/codesyntax]
Screen shots: –
After Execution: –