;**************************************************************************;
; ;
; By : ;
; Muhammad Tahir Shahzad [ MTS ] ;
; B.C.S Honours [ 2000-04 ] ;
; Government College University Lahore ;
; Pakistan ;
; ;
; E-mail : mtshome@wol.net.pk ;
; ;
; Web-Site : www.mts-home.cjb.net [ www.wol.net.pk/mtshome ] ;
; www.mtshome.cjb.net [ www.geocities.com/mtahirshahzad ] ;
; ;
; ;
;**************************************************************************;
TITLE AL-079 : An AL Program that will print the name of each student and
; his or her average ( truncated to an integer) for the four
; exams.
; Suppose the class records are stored as follows:
; CLASS DB 'Mary Allen ',67,45,98,33
; DB 'Scott Baylis',70,56,87,44
; DB 'George Frank',82,72,89,40
; DB 'Sam Wong ',78,76,92,60
; Note : Each name occupies 12 bytes.
.MODEL SMALL
.STACK 100H
.DATA
PROMPT_1 DB 'The Class Marks are as follows : ',0DH,0AH,'$'
PROMPT_2 DB 0DH,0AH,'The Average Marks of Students are as follows : ',0DH,0AH,'$'
AVERAGE DW 4 DUP(0)
CLASS DB 'Mary Allen ',67,45,98,33
DB 'Scott Baylis',70,56,87,44
DB 'George Frank',82,72,89,40
DB 'Sam Wong ',78,76,92,60
.CODE
MAIN PROC
MOV AX, @DATA ; initialize DS
MOV DS, AX
LEA DX, PROMPT_1 ; load and print the string PROMPT_1
MOV AH, 9
INT 21H
LEA SI, CLASS ; set SI=offset address of variable CLASS
MOV BH, 4 ; set BH=4
MOV BL, 16 ; set BL=16
CALL PRINT_2D_ARRAY ; call the procedure PRINT_2D_ARRAY
LEA DI, AVERAGE ; set DI=offset address of variable AVERAGE
LEA SI, CLASS ; set SI=offset address of variable CLASS
ADD SI, 12 ; set SI=SI+12
MOV CX, 4 ; set CX=4
@COMPUTE_AVERAGE: ; loop label
XOR AX, AX ; clear AX
MOV DX, 4 ; set DX=4
@SUM: ; loop label
XOR BH, BH ; clear BH
MOV BL, [SI] ; set BL=[SI]
ADD AX, BX ; set AX=AX+BX
INC SI ; set SI=SI+1
DEC DX ; set DX=DX-1
JNZ @SUM ; jump to label @SUM if DX!=0
MOV BX, 4 ; set BX=4
DIV BX ; set AX=DX:AX/BX , DX=DX:AX%BX
MOV [DI], AX ; set [DI]=AX
ADD DI, 2 ; set DI=DI+2
ADD SI, 12 ; set SI=SI+12
LOOP @COMPUTE_AVERAGE ; jump to label @COMPUTE_AVERAGE while CX!=0
LEA DX, PROMPT_2 ; load and print the string PROMPT_2
MOV AH, 9
INT 21H
LEA SI, AVERAGE ; set SI=offset address of variable AVERAGE
LEA DI, CLASS ; set DI=offset address of variable CLASS
MOV CX, 4 ; set CX=4
@PRINT_RESULT: ; loop label
MOV BX, 12 ; set BX=12
MOV AH, 2 ; set output function
@NAME: ; loop label
MOV DL, [DI] ; set DL=[DI]
INT 21H ; print a character
INC DI ; set DI=DI+1
DEC BX ; set BX=BX-1
JNZ @NAME ; jump to label @NAME if BX!=0
MOV DL, 20H ; set DL=20H
INT 21H ; print a character
MOV DL, ":" ; set DL=":"
INT 21H ; print a character
MOV DL, 20H ; set DL=20H
INT 21H ; print a character
XOR AH, AH ; clear AH
MOV AL, [SI] ; set AL=[SI]
CALL OUTDEC ; call the procedure OUTDEC
MOV AH, 2 ; set output function
MOV DL, 0DH ; carriage return
INT 21H
MOV DL, 0AH ; line feed
INT 21H
ADD SI, 2 ; set SI=SI+2
ADD DI, 4 ; set DI=DI+4
LOOP @PRINT_RESULT ; jump to label @PRINT_RESULT while CX!=0
MOV AH, 4CH ; return control to DOS
INT 21H
MAIN ENDP
;**************************************************************************;
;**************************************************************************;
;------------------------- Procedure Definitions ------------------------;
;**************************************************************************;
;**************************************************************************;
;**************************************************************************;
;----------------------------- PRINT_2D_ARRAY ---------------------------;
;**************************************************************************;
PRINT_2D_ARRAY PROC
; this procedure will print the given 2D array
; input : SI=offset address of the 2D array
; : BH=number of rows
; : BL=number of columns
; output : none
PUSH AX ; push BX onto the STACK
PUSH CX ; push CX onto the STACK
PUSH DX ; push DX onto the STACK
PUSH SI ; push SI onto the STACK
MOV CX, BX ; set CX=BX
@OUTER_LOOP: ; loop label
MOV CL, BL ; set CL=BL
MOV AH, 2 ; set output function
@PRINT_NAME: ; loop label
MOV DL, [SI] ; set DL=[SI]
INT 21H ; print a character
INC SI ; set SI=SI+1
DEC CL ; set CL=CL-1
CMP CL, 4 ; compare CL with 4
JG @PRINT_NAME ; jump to label @PRINT_NAME if CL>4
MOV DL, 20H ; set DL=20H
INT 21H ; print a character
@INNER_LOOP: ; loop label
MOV AH, 2 ; set output function
MOV DL, 20H ; set DL=20H
INT 21H ; print a character
XOR AH, AH
MOV AL, [SI] ; set AX=[SI]
CALL OUTDEC ; call the procedure OUTDEC
INC SI ; set SI=SI+1
DEC CL ; set CL=CL-1
JNZ @INNER_LOOP ; jump to label @INNER_LOOP if CL!=0
MOV AH, 2 ; set output function
MOV DL, 0DH ; set DL=0DH
INT 21H ; print a character
MOV DL, 0AH ; set DL=0AH
INT 21H ; print a character
DEC CH ; set CH=CH-1
JNZ @OUTER_LOOP ; jump to label @OUTER_LOOP if CX!=0
POP SI ; pop a value from STACK into SI
POP DX ; pop a value from STACK into DX
POP CX ; pop a value from STACK into CX
POP AX ; pop a value from STACK into AX
RET
PRINT_2D_ARRAY ENDP
;**************************************************************************;
;-------------------------------- OUTDEC --------------------------------;
;**************************************************************************;
OUTDEC PROC
; this procedure will display a decimal number
; input : AX
; output : none
PUSH BX ; push BX onto the STACK
PUSH CX ; push CX onto the STACK
PUSH DX ; push DX onto the STACK
XOR CX, CX ; clear CX
MOV BX, 10 ; set BX=10
@OUTPUT: ; loop label
XOR DX, DX ; clear DX
DIV BX ; divide AX by BX
PUSH DX ; push DX onto the STACK
INC CX ; increment CX
OR AX, AX ; take OR of Ax with AX
JNE @OUTPUT ; jump to label @OUTPUT if ZF=0
MOV AH, 2 ; set output function
@DISPLAY: ; loop label
POP DX ; pop a value from STACK to DX
OR DL, 30H ; convert decimal to ascii code
INT 21H ; print a character
LOOP @DISPLAY ; jump to label @DISPLAY if CX!=0
POP DX ; pop a value from STACK into DX
POP CX ; pop a value from STACK into CX
POP BX ; pop a value from STACK into BX
RET ; return control to the calling procedure
OUTDEC ENDP
;**************************************************************************;
;--------------------------------------------------------------------------;
;**************************************************************************;
END MAIN
;**************************************************************************;
;**************************************************************************;
;------------------------------ THE END ---------------------------------;
;**************************************************************************;
;**************************************************************************;