Microprocessor Lab Manual
Microprocessor Lab Manual
Department of
Electronics and Communication Engineering
LAB MANUAL
E-mail: 7mamunurrashed@gmail.com
In Supervision of:
E-mail: litu702@gmail.com
National University of Bangladesh
Lab Report
Submitted by-
Name:
Department:
Class Roll:
Exam Roll:
Registration No.:
Session:
Course Name:
Course Code:
Program Page
Program Name
No. No.
SUM PROC
; THIS PROCEDURE WILL CALCULATE THE SUM OF AN ARRAY
; INPUT : SI=OFFSET ADDRESS OF THE ARRAY
; : BX=SIZE OF THE ARRAY
; OUTPUT : AX=SUM OF THE ARRAY
PUSH CX ; PUSH CX ONTO THE STACK
PUSH DX ; PUSH DX ONTO THE STACK
XOR AX, AX ; CLEAR AX
XOR DX, DX ; CLEAR DX
MOV CX, BX ; SET CX=BX
@SUM: ; LOOP LABEL
MOV DL, [SI] ; SET DL=[SI]
ADD AX, DX ; SET AX=AX+DX
INC SI ; SET SI=SI+1
LOOP @SUM ; JUMP TO LABEL @SUM WHILE CX!=0
POP DX ; POP A VALUE FROM STACK INTO DX
POP CX ; POP A VALUE FROM STACK INTO CX
RET ; RETURN CONTROL TO THE CALLING PROCEDURE
SUM 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
CMP AX, 0 ; COMPARE AX WITH 0
JGE @START ; JUMP TO LABEL @START IF AX>=0
PUSH AX ; PUSH AX ONTO THE STACK
MOV AH, 2 ; SET OUTPUT FUNCTION
MOV DL, ' ' ; SET DL=\'-\'
INT 21H ; PRINT THE CHARACTER
POP AX ; POP A VALUE FROM STACK INTO AX
NEG AX ; TAKE 2\'S COMPLEMENT OF AX
@START: ; JUMP LABEL
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
ENDP MAIN
Output:
Program No: 20
Program Name: An assembly language program to bubble sort an array.
Source Code:
.MODEL SMALL
.STACK 100H
.DATA
PROMPT_1 DB 'THE CONTENTS OF THE ARRAY BEFORE SORTING : $\'
PROMPT_2 DB 0DH,0AH,'THE CONTENTS OF THE ARRAY AFTER SORTING : $\'
ARRAY DB 5,3,9,0,2,6,1,7,8,4
.CODE
MAIN PROC
MOV AX, @DATA ; INITIALIZE DS
MOV DS, AX
MOV BX, 10 ; SET BX=10
LEA DX, PROMPT_1 ; LOAD AND DISPLAY THE STRING PROMPT_1
MOV AH, 9
INT 21H
LEA SI, ARRAY ; SET SI=OFFSET ADDRESS OF ARRAY
CALL PRINT_ARRAY ; CALL THE PROCEDURE PRINT_ARRAY
LEA SI, ARRAY ; SET SI=OFFSET ADDRESS OF THE ARRAY
CALL BUBBLE_SORT ; CALL THE PROCEDURE BUBBLE_SORT
LEA DX, PROMPT_2 ; LOAD AND DISPLAY THE STRING PROMPT_2
MOV AH, 9
INT 21H
LEA SI, ARRAY ; SET SI=OFFSET ADDRESS OF ARRAY
CALL PRINT_ARRAY ; CALL THE PROCEDURE PRINT_ARRAY
MOV AH, 4CH ; RETURN CONTROL TO DOS
INT 21H
MAIN ENDP
PRINT_ARRAY PROC
; THIS PROCEDURE WILL PRINT THE ELEMENTS OF A GIVEN ARRAY
; INPUT : SI=OFFSET ADDRESS OF THE ARRAY
; : BX=SIZE OF THE ARRAY
; OUTPUT : NONE
PUSH AX ; PUSH AX ONTO THE STACK
PUSH CX ; PUSH CX ONTO THE STACK
PUSH DX ; PUSH DX ONTO THE STACK
MOV CX, BX ; SET CX=BX
@PRINT_ARRAY: ; LOOP LABEL
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, 20H ; SET DL=20H
INT 21H ; PRINT A CHARACTER
INC SI ; SET SI=SI+1
LOOP @PRINT_ARRAY ; JUMP TO LABEL @PRINT_ARRAY WHILE CX!=0
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 ; RETURN CONTROL TO THE CALLING PROCEDURE
PRINT_ARRAY ENDP
BUBBLE_SORT PROC
; THIS PROCEDURE WILL SORT THE ARRAY IN ASCENDING ORDER
; INPUT : SI=OFFSET ADDRESS OF THE ARRAY
; : BX=ARRAY SIZE
; OUTPUT : NONE
PUSH AX ; PUSH AX ONTO THE STACK
PUSH BX ; PUSH BX ONTO THE STACK
PUSH CX ; PUSH CX ONTO THE STACK
PUSH DX ; PUSH DX ONTO THE STACK
PUSH DI ; PUSH DI ONTO THE STACK
MOV AX, SI ; SET AX=SI
MOV CX, BX ; SET CX=BX
DEC CX ; SET CX=CX-1
@OUTER_LOOP: ; LOOP LABEL
MOV BX, CX ; SET BX=CX
MOV SI, AX ; SET SI=AX
MOV DI, AX ; SET DI=AX
INC DI ; SET DI=DI+1
@INNER_LOOP: ; LOOP LABEL
MOV DL, [SI] ; SET DL=[SI]
CMP DL, [DI] ; COMPARE DL WITH [DI]
JNG @SKIP_EXCHANGE ; JUMP TO LABEL @SKIP_EXCHANGE IF DL<[DI]
XCHG DL, [DI] ; SET DL=[DI], [DI]=DL
MOV [SI], DL ; SET [SI]=DL
@SKIP_EXCHANGE: ; JUMP LABEL
INC SI ; SET SI=SI+1
INC DI ; SET DI=DI+1
DEC BX ; SET BX=BX-1
JNZ @INNER_LOOP ; JUMP TO LABEL @INNER_LOOP IF BX!=0
LOOP @OUTER_LOOP ; JUMP TO LABEL @OUTER_LOOP WHILE CX!=0
POP DI ; POP A VALUE FROM STACK INTO DI
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
POP AX ; POP A VALUE FROM STACK INTO AX
RET ; RETURN CONTROL TO THE CALLING PROCEDURE
BUBBLE_SORT ENDP
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
ENDP MAIN
Output: