0% found this document useful (0 votes)
83 views

Assignment 9

This document contains an assembly language program that performs two tasks: 1) It takes a time in seconds from the user and converts it to hours, minutes and seconds format. 2) It finds the greatest common divisor (GCD) of two integers entered by the user. Both programs use subroutines to read input, display output and perform calculations.

Uploaded by

Mysha Anowar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
83 views

Assignment 9

This document contains an assembly language program that performs two tasks: 1) It takes a time in seconds from the user and converts it to hours, minutes and seconds format. 2) It finds the greatest common divisor (GCD) of two integers entered by the user. Both programs use subroutines to read input, display output and perform calculations.

Uploaded by

Mysha Anowar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 17

Ahsanullah University of Science & Technology

Department of Computer Science & Engineering

Course No: CSE2214


Course Title: Assembly Language Programming Sessional
Assignment No: 09

Date of Performance: 31.08.2020


Date of Submission: 07.08.2020
Submitted To: Ms.Tahsin Aziz & Ms. Anika Sayara

Submitted By-
Group: B1
Name: Md. Rakibul Islam
Id: 18.01.04.072
Section: B
Question No: 01
Question: Write a program that lets the user enter time in seconds, up to 65535,
and outputs the time as hours, minutes, and seconds.
Answer:
;a program that lets the user enter time in seconds, up to 65535, and outputs
;the time as hours, minutes, and seconds

.MODEL SMALL
.STACK 100H
.DATA
MSG1 DB 'Enter the time in seconds up to 65535 = $\'
MSG2 DB 0DH,0AH,'The time in hh:mm:ss format is = $\'
SEPARATOR DB ' : $\'

.CODE
MAIN PROC
MOV AX,@DATA ;initialize DS
MOV DS,AX

LEA DX,MSG1 ;load and display the string MSG1


MOV AH,9
INT 21H

CALL INDEC ;call the procedure INDEC

PUSH AX ;puah AX onto the STACK

LEA DX,MSG2 ;load and display the string MSG2


MOV AH,9
INT 21H

POP AX ;pop a value from STACK into AX

XOR DX,DX ;clear DX


MOV CX,3600 ;set CX=3600
DIV CX ;set AX=DX:AX\\CX , DX=DX:AX%CX
CMP AX,10 ;compare AX with 10
JGE HOURS ;jump to label HOURS if AX>=10

PUSH AX ;push AX onto the STACK

MOV AX,0 ;set AX=0


CALL OUTDEC ;call the procedure OUTDEC

POP AX ;pop a value from STACK into AX

HOURS:
CALL OUTDEC ;call the procedure OUTDEC

MOV AX,DX ;set AX=DX

PUSH AX ;push AX onto the STACK

LEA DX,SEPARATOR ;load and display the string SEPARATOR


MOV AH,9
INT 21H

POP AX ;pop a value from STACK into AX


XOR DX,DX ;clear DX

MOV CX,60 ;set CX=60


DIV CX ;set AX=DX:AX\\CX , DX=DX:AX%CX

CMP AX,10 ;compare AX with 10


JGE MINUTES ;jump to label MINUTES if AX>=10

PUSH AX ;push AX onto the STACK

MOV AX,0 ;set AX=0


CALL OUTDEC ;call the procedure OUTDEC
POP AX ;pop a value from STACK into AX

MINUTES:
CALL OUTDEC ;call the procedure OUTDEC

MOV BX,DX ;set BX=DX

LEA DX,SEPARATOR ;load and display the string SEPARATOR


MOV AH,9
INT 21H

MOV AX,BX ;set AX=BX

CMP AX,10 ;compare AX with 10


JGE SECONDS ;jump to label SECONDS if AX>=10

PUSH AX ;push AX onto the STACK

MOV AX,0 ;set AX=0


CALL OUTDEC ;call the procedure OUTDEC

POP AX ;pop a value from STACK into AX

SECONDS:
CALL OUTDEC ;call the procedure OUTDEC

MOV AH,4CH ;return 0


INT 21H
MAIN ENDP

;Procedure Definitions: INDEC


;this procedure will read a number in decimal form
;input : none
;output : store binary number in AX
;uses : MAIN
INDEC PROC
PUSH BX ;push BX onto the STACK
PUSH CX ;push CX onto the STACK
PUSH DX ;push DX onto the STACK

JMP READ ;jump to label READ

SKIP_BACKSPACE:
MOV AH,2 ;set output function
MOV DL,20H ;set DL=' \'
INT 21H ;print a character

READ:
XOR BX,BX ;clear BX
XOR CX,CX ;clear CX
XOR DX,DX ;clear DX

MOV AH,1 ;set input function


INT 21H ;read a character

CMP AL,"-" ;compare AL with "-"


JE MINUS ;jump to label MINUS if AL="-"

CMP AL,"+" ;compare AL with "+"


JE PLUS ;jump to label PLUS if AL="+"

JMP SKIP_INPUT ;jump to label SKIP_INPUT

MINUS:
MOV CH,1 ;set CH=1
INC CL ;set CL=CL+1
JMP INPUT ;jump to label INPUT

PLUS:
MOV CH,2 ;set CH=2
INC CL ;set CL=CL+1

INPUT:
MOV AH,1 ;set input function
INT 21H ;read a character

SKIP_INPUT:

CMP AL,0DH ;compare AL with CR


JE JUMP_TO_END_INPUT ;jump to label JUMP_TO_END_INPUT

CMP AL,8H ;compare AL with 8H


JNE NOT_BACKSPACE ;jump to label NOT_BACKSPACE if AL!=8

CMP CH,0 ;compare CH with 0


JNE CHECK_REMOVE_MINUS ;jump to label CHECK_REMOVE_MINUS if
CH!=0

CMP CL,0 ;compare CL with 0


JE SKIP_BACKSPACE ;jump to label SKIP_BACKSPACE if CL=0
JMP MOVE_BACK ;jump to label MOVE_BACK

JUMP_TO_END_INPUT:

JMP END_INPUT ;jump to label END_INPUT

CHECK_REMOVE_MINUS:

CMP CH,1 ;compare CH with 1


JNE CHECK_REMOVE_PLUS ;jump to label CHECK_REMOVE_PLUS if CH!=1

CMP CL,1 ;compare CL with 1


JE REMOVE_PLUS_MINUS ;jump to label REMOVE_PLUS_MINUS if CL=1

CHECK_REMOVE_PLUS:
CMP CL,1 ;compare CL with 1
JE REMOVE_PLUS_MINUS ;jump to label REMOVE_PLUS_MINUS if CL=1
JMP MOVE_BACK ;jump to label MOVE_BACK

REMOVE_PLUS_MINUS:
MOV AH,2 ;set output function
MOV DL,20H ;set DL=\' \'
INT 21H ;print a character

MOV DL,8H ;set DL=8H


INT 21H ;print a character

JMP READ ;jump to label READ

MOVE_BACK:

MOV AX,BX ;set AX=BX


MOV BX,10 ;set BX=10
DIV BX ;set AX=AX/BX

MOV BX,AX ;set BX=AX

MOV AH,2 ;set output function


MOV DL,20H ;set DL=\' \'
INT 21H ;print a character

MOV DL,8H ;set DL=8H


INT 21H ;print a character

XOR DX,DX ;clear DX


DEC CL ;set CL=CL-1

JMP INPUT ;jump to label INPUT

NOT_BACKSPACE:
INC CL ;set CL=CL+1

CMP AL,30H ;compare AL with 0


JL ERROR ;jump to label ERROR if AL<0

CMP AL,39H ;compare AL with 9


JG ERROR ;jump to label ERROR if AL>9

AND AX,000FH ;convert ascii to decimal code

PUSH AX ;push AX onto the STACK

MOV AX,10 ;set AX=10


MUL BX ;set AX=AX*BX
MOV BX,AX ;set BX=AX

POP AX ;pop a value from STACK into AX

ADD BX,AX ;set BX=AX+BX


JC ERROR

CMP CL,5
JG ERROR
JMP INPUT ;jump to label @INPUT

ERROR:

MOV AH,2 ;set output function


MOV DL,7H ;set DL=7H
INT 21H ;print a character

XOR CH,CH ;clear CH

CLEAR:
MOV DL,8H ;set DL=8H
INT 21H ;print a character
MOV DL,20H ;set DL=\' \'
INT 21H ;print a character

MOV DL,8H ;set DL=8H


INT 21H ;print a character
LOOP CLEAR ;jump to label CLEAR if CX!=0

JMP READ ;jump to label READ

END_INPUT:

CMP CH,1 ;compare CH with 1


JNE EXIT ;jump to label EXIT if CH!=1
NEG BX ;negate BX

EXIT:

MOV AX,BX ;set AX=BX

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


INDEC ENDP

;Procedure Definitions: OUTDEC


;this procedure will display a decimal number
;input : AX
;output : none
;uses : MAIN
OUTDEC PROC
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:
XOR CX,CX ;clear CX
MOV BX,10 ;set BX=10

OUTPUT:
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:
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
Question No: 02
Question: Write a program to find the greatest common divisor (GCD) of two
integers M and N, according to the following algorithm:
a. Divide M by N, getting quotient Q and remainder R.
b. If R = 0 then stop. N is the GCD of M and N.
c. If R <> 0 replace M by N, N by R, and repeat step 1
Answer:
;a program to find the greatest common divisor (GCD) of two integers M and N

.MODEL SMALL
.STACK 100H
.DATA
MSG1 DB 'Enter the value of M = $'
MSG2 DB 0DH,0AH,'Enter the value of N = $'
MSG3 DB 0DH,0AH,'The GCD of M and N is = $'

.CODE
MAIN PROC
MOV AX,@DATA ;initialize DS
MOV DS,AX

LEA DX,MSG1 ;load and display the string MSG1


MOV AH,9
INT 21H

CALL INDEC ;call the procedure INDEC

PUSH AX ;push AX onto the STACK

LEA DX,MSG2 ;load and display the string MSG2


MOV AH,9
INT 21H

CALL INDEC ;call the procedure INDEC

MOV BX,AX ;set BX=AX


POP AX ;pop a value from STACK into AX

REPEAT:
XOR DX,DX ;clear DX
DIV BX ;set AX=DX:AX\BX , AX=DX:AX%BX

CMP DX,0 ;compare DX with 0


JE END_LOOP ;jump to label END_LOOP if CX=0

MOV AX,BX ;set AX=BX


MOV BX,DX ;set BX=DX
JMP REPEAT ;jump to label REPEAT

END_LOOP:

LEA DX,MSG3 ;load and display the string MSG3


MOV AH,9
INT 21H

MOV AX,BX ;set AX=BX

CALL OUTDEC ;call the procedure OUTDEC

MOV AH,4CH ;return 0


INT 21H
MAIN ENDP

;Procedure Definition: INDEC


;this procedure will read a number indecimal form
;input : none
;output : store binary number in AX
;uses : MAIN
INDEC PROC
PUSH BX ;push BX onto the STACK
PUSH CX ;push CX onto the STACK
PUSH DX ;push DX onto the STACK

JMP READ ;jump to label READ

SKIP_BACKSPACE:
MOV AH,2 ;set output function
MOV DL,20H ;set DL=' '
INT 21H ;print a character

READ:
XOR BX,BX ;clear BX
XOR CX,CX ;clear CX
XOR DX,DX ;clear DX

MOV AH,1 ;set input function


INT 21H ;read a character

CMP AL,"-" ;compare AL with "-"


JE MINUS ;jump to label MINUS if AL="-"

CMP AL,"+" ;compare AL with "+"


JE PLUS ;jump to label PLUS if AL="+"

JMP SKIP_INPUT ;jump to label SKIP_INPUT

MINUS:
MOV CH,1 ;set CH=1
INC CL ;set CL=CL+1
JMP INPUT ;jump to label INPUT

PLUS:
MOV CH,2 ;set CH=2
INC CL ;set CL=CL+1

INPUT:
MOV AH,1 ;set input function
INT 21H ;read a character

SKIP_INPUT:

CMP AL,0DH ;compare AL with CR


JE END_INPUT ;jump to label END_INPUT

CMP AL,8H ;compare AL with 8H


JNE NOT_BACKSPACE ;jump to label NOT_BACKSPACE if AL!=8

CMP CH,0 ;compare CH with 0


JNE CHECK_REMOVE_MINUS ;jump to label CHECK_REMOVE_MINUS if
CH!=0
CMP CL,0 ;compare CL with 0
JE SKIP_BACKSPACE ;jump to label SKIP_BACKSPACE if CL=0
JMP MOVE_BACK ;jump to label MOVE_BACK

CHECK_REMOVE_MINUS:

CMP CH,1 ;compare CH with 1


JNE CHECK_REMOVE_PLUS ;jump to label CHECK_REMOVE_PLUS if CH!=1

CMP CL,1 ;compare CL with 1


JE REMOVE_PLUS_MINUS ;jump to label REMOVE_PLUS_MINUS if CL=1

CHECK_REMOVE_PLUS:

CMP CL,1 ;compare CL with 1


JE REMOVE_PLUS_MINUS ;jump to label REMOVE_PLUS_MINUS if CL=1
JMP MOVE_BACK ;jump to label MOVE_BACK

REMOVE_PLUS_MINUS:
MOV AH,2 ;set output function
MOV DL,20H ;set DL=' '
INT 21H ;print a character

MOV DL,8H ;set DL=8H


INT 21H ;print a character

JMP READ ;jump to label READ

MOVE_BACK:

MOV AX,BX ;set AX=BX


MOV BX,10 ;set BX=10
DIV BX ;set AX=AX/BX

MOV BX,AX ;set BX=AX

MOV AH,2 ;set output function


MOV DL,20H ;set DL=' '
INT 21H ;print a character

MOV DL,8H ;set DL=8H


INT 21H ;print a character
XOR DX,DX ;clear DX
DEC CL ;set CL=CL-1

JMP INPUT ;jump to label @INPUT

NOT_BACKSPACE:

INC CL ;set CL=CL+1

CMP AL,30H ;compare AL with 0


JL ERROR ;jump to label ERROR if AL<0

CMP AL,39H ;compare AL with 9


JG ERROR ;jump to label ERROR if AL>9

AND AX,000FH ;convert ascii to decimal code

PUSH AX ;push AX onto the STACK

MOV AX,10 ;set AX=10


MUL BX ;set AX=AX*BX
MOV BX,AX ;set BX=AX

POP AX ;pop a value from STACK into AX

ADD BX,AX ;set BX=AX+BX


JS ERROR ;jump to label ERROR if SF=1
JMP INPUT ;jump to label INPUT

ERROR:

MOV AH,2 ;set output function


MOV DL,7H ;set DL=7H
INT 21H ;print a character

XOR CH,CH ;clear CH

CLEAR:
MOV DL,8H ;set DL=8H
INT 21H ;print a character

MOV DL,20H ;set DL=' '


INT 21H ;print a character
MOV DL,8H ;set DL=8H
INT 21H ;print a character
LOOP CLEAR ;jump to label CLEAR if CX!=0

JMP READ ;jump to label READ

END_INPUT:

CMP CH,1 ;compare CH with 1


JNE EXIT ;jump to label EXIT if CH!=1
NEG BX ;negate BX

EXIT:

MOV AX,BX ;set AX=BX

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


INDEC ENDP
;Procedure Definition: OUTDEC
;this procedure will display a decimal number
;input : AX
;output : none
;uses : MAIN
OUTDEC PROC
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:

XOR CX,CX ;clear CX


MOV BX,10 ;set BX=10

OUTPUT:
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:
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

You might also like