9. TITLE PROB9 PAGE 60,132 EXTRN ASC2B_CON:FAR EXTRN B2ASC_CON:FAR PUBLIC TEN STSEG SEGMENT DB 64 DUP (?) STSEG ENDS ;--- DTSEG SEGMENT TEN DW 10
MESSAGE1 DB CR,LF,'Enter a three digit number','$' ORG 20H
NUMBER1 DB 4,?,4 DUP (0) NUMBER2 DB 4,?,4 DUP (0)
ORG 30H
MESSAGE2 DB CR,LF,'The average is ' ASC_AVG DB 5 DUP (20H),'$' DTSEG ENDS
CR EQU 0DH ;EQUATE CR WITH ASCII CODE FOR CARRIAGE RETURN LF EQU 0AH ;EQUATE LF WITH ASCII CODE FOR LINE FEED
;---
CDSEG SEGMENT MAIN PROC FAR
ASSUME CS:CDSEG,DS:DTSEG,SS:STSEG MOV AX,DTSEG
MOV DS,AX
MOV AX,0600H ;clear the screen MOV BH,07
MOV CX,0000 MOV DX,184FH
INT 10H
MOV AH,09 ;prompt for the first number MOV DX,OFFSET MESSAGE1
INT 21H
MOV AH,0AH ;get the first number MOV DX,OFFSET NUMBER1
INT 21H
MOV AH,09 ;prompt for the second number MOV DX,OFFSET MESSAGE1
INT 21H
MOV AH,0AH ;get the second number MOV DX,OFFSET NUMBER2
INT 21H
;SI and BX must be set up for ASC2B_CON
MOV SI,OFFSET NUMBER1 + 2 ;SI points to beginning of ASCII string SUB BH,BH ;BX = string length - 1
MOV BL,BYTE PTR [SI-1] DEC BX
CALL ASC2B_CON ;convert number 1 to hex MOV CX,AX ;save number1 in CX
MOV SI,OFFSET NUMBER2 + 2 ;SI points to beginning of ASCII string SUB BH,BH ;BX = string length - 1
MOV BL,BYTE PTR [SI-1]
DEC BX
CALL ASC2B_CON ;convert number 2 to hex ADD AX,CX ;add the numbers
SHR AX,1 ;divide by 2
MOV SI,OFFSET ASC_AVG ;SI points to
CALL B2ASC_CON ;convert AX to ASCII MOV AH,09 ;display average MOV DX,OFFSET MESSAGE2
INT 21H MOV AH,4CH
INT 21H ;go back to DOS MAIN ENDP
CDSEG ENDS
END MAIN
TITLE B2ASC BINARY TO DECIMAL CONVERSION MODULE PAGE 60,132
;this module converts a binary (hex) number up to FFFFH to decimal ; then makes it displayable (ASCII)
;CALLING PROGRAM SETS
; AX = BINARY VALUE TO BE CONVERTED TO ASCII
; SI = OFFSET ADDRESS WHERE ASCII VALUE TO BE STORED PUBLIC B2ASC_CON
CDSEG SEGMENT PARA PUBLIC 'CODE' B2ASC_CON PROC FAR
ASSUME CS:CDSEG
PUSHF ;STORE REGS CHANGED BY THIS MODULE PUSH BX
PUSH DX
MOV BX,10 ;BX=10 THE DIVISOR
ADD SI,4 ;SI POINTS TO LAST ASCII DIGIT B2A_LOOP: SUB DX,DX ;DX MUST BE 0 IN WORD DIVISION DIV BX ;DIVIDE HEX NUMBER BY 10 (BX=10) OR DL,30H ;TAG '3' TO REMAINDER TO MAKE IT ASCII MOV [SI],DL ;MOVE THE ASCII DIGIT
DEC SI ;DECREMENT POINTER
CMP AX,0 ;CONTINUE LOOPING WHILE AX 0 JA B2A_LOOP
POP DX ;RESTORE REGISTERS POP BX POPF RET B2ASC_CON ENDP CDSEG ENDS END
TITLE ASC2B ASCII TO BINARY CONVERSION MODULE PAGE 60,132
;this module converts any ASCII number between 0 to 65535 to binary ;CALLING PROGRAM SETS SI = OFFSET OF ASCII STRING
; BX = STRING LENGTH - 1 (USED AS INDEX INTO ASCII NUMBER) ;THIS MODULE SETS AX = BINARY NUMBER
;---
EXTRN TEN:WORD PUBLIC ASC2B_CON
CDSEG SEGMENT PARA PUBLIC 'CODE' ASC2B_CON PROC FAR
ASSUME CS:CDSEG
PUSHF ;STORE REGS CHANGED IN THIS MODULE PUSH DI
PUSH CX
SUB DI,DI ;CLEAR DI FOR THE BINARY(HEX) RESULT MOV CX,1 ;CX = WEIGHT FACTOR
A2B_LOOP: MOV AL,[SI+BX] ;GET THE ASCII DIGIT AND AL,0FH ;STRIP OFF '3'
SUB AH,AH ;CLEAR AH FOR WORD MULTIPLICATION MUL CX ;MULTIPLY BY THE WEIGHT
ADD DI,AX ;ADD IT TO BINARY (HEX) RESULT MOV AX,CX ;MULTIPLY THE WEIGHT FACTOR MUL TEN ; BY TEN
MOV CX,AX ; FOR NEXT ITERATION DEC BX ;DECREMENT DIGIT POINTER JNS A2B_LOOP ;JUMP IF OFFSET 0
MOV AX,DI ;STORE BINARY NUMBER IN AX POP CX ;RESTORE FLAGS
POP DI POPF RET ASC2B_CON ENDP CDSEG ENDS END
10. The program follows: TITLE PROB10 PAGE 60,132 EXTRN SUBPROG1:FAR EXTRN SUBPROG2:FAR PUBLIC PRODUCT PUBLIC QUOTIENT ;---
STSEG SEGMENT PARA STACK 'STACK' DB 100 DUP(?)
STSEG ENDS
DTSEG SEGMENT PARA 'DATA' VALUE1 DW 1228 VALUE2 DW 52400 PRODUCT DW 2 DUP (?) QUOTIENT DW (?) REMAINDER DW (?) DTSEG ENDS
CODSG_A SEGMENT PARA 'CODE' MAIN PROC FAR
ASSUME CS:CODSG_A,DS:DTSEG,SS:STSEG MOV AX,DTSEG
MOV DS,AX
PUSH VALUE1 PUSH VALUE2
CALL SUBPROG1 ;CALL SUBPROG TO MUL VALUE1 * VALUE2 PUSH VALUE1
PUSH VALUE2
CALL SUBPROG2 ;CALL SUBPROG TO DIV VALUE2 / VALUE1 MOV AH,4CH
INT 21H ;GO BACK TO DOS MAIN ENDP
CODSG_A ENDS
END MAIN
;THIS PROGRAM MULTIPLIES TWO EXTERNALLY DEFINED WORDS ;AND STORES THE PRODUCT IN AN EXTERNALLY DEFINED DWORD
TITLE SUBPROG1 PROGRAM TO MULTIPLY TWO WORDS PAGE 60,132
EXTRN PRODUCT:WORD PUBLIC SUBPROG1
CODSG_C SEGMENT PARA 'CODE' SUBPROG1 PROC FAR
ASSUME CS:CODSG_C
PUSH BP ;save SP
MOV BP,SP ;set up BP to access stack MOV AX,[BP]+8 ;get VALUE1
MOV CX,[BP]+6 ;get VALUE2 SUB BX,BX ;initialize carry count MUL CX ;mul value1 * value2 MOV PRODUCT,AX ;store product
MOV PRODUCT+2,DX ;store upper word or product
POP BP ;restore BP
RET 4
CODSG_C ENDS
END
;THIS PROGRAM DIVIDES TWO EXTERNALLY DEFINED WORDS ;AND STORES THE QUOTIENT IN AN EXTERNALLY DEFINED WORD TITLE SUBPROG2 PROGRAM TO ADD TWO WORDS
PAGE 60,132
EXTRN QUOTIENT:WORD
EXTRN REMAINDER:WORD
PUBLIC SUBPROG2 CODSG_B SEGMENT PARA 'CODE' SUBPROG2 PROC FAR
ASSUME CS:CODSG_B
PUSH BP ;save BP
MOV BP,SP ;set up BP to access stack MOV AX,[BP]+6 ;move VALUE2 to AX MOV BX,[BP]+8 ;move VALUE1 to BX SUB DX,DX ;INITIALIZE REM DIV BX ;divide VALUE2/VALUE1
MOV QUOTIENT,AX ;store quotient MOV REMAINDER,DX ;store remainder
POP BP ;restore BP
RET 4
SUBPROG2 ENDP CODSG_B ENDS