In: Computer Science
*Microprocessors*
Write a program sequence that will test the byte STATUS and branch to ROOTINE_1 if bit 1, 2, or 4 is 1. Otherwise, it is a branch to ROUTINE_2 if both bits 1 and 3 are 1 and to ROUTINE_3 if both bits 1 and 3 are 0. In all other cases, it is to execute ROUTINE_4. Assume that the routines are more than 128 bytes long. Also, give a flowchart of the sequence.
In ASSEMBLY PROGRAM
Greetings!!
Code with comments:
ORG 100h
.DATA
NUM DB ?
PROMPT DB 10,13,"PLEASE ENTER ANY NUMBER BETWEEN 00-99:$"
M1 DB 10,13,"BITS 1,4 OR 2 ARE 1 & IN ROUTINE
1$"
M2 DB 10,13,"BITS 1 AND 3 ARE 1 & IN ROUTINE 2 $"
M3 DB 10,13,"BITS 1 AND 3 ARE 0 & IN ROUTINE 3$"
M4 DB 10,13,"IN ROUTINE 4$"
.CODE
MOV AX,@DATA
MOV DS,AX
MOV DX,OFFSET PROMPT
MOV AH,9
INT 21H
MOV AH,1 ;READ 1ST DIGIT
INT 21H
SUB AL,30H
MOV BL,AL
SHL BL,4 ;SHIFT THE 1ST DIGIT TO LEFT TO MAKE INDIVIDUAL 2 DIGITS
INTO SINGLE 2 DIGIT NUMBER
MOV AH,1 ;READ THE SECOND DIGIT
INT 21H
SUB AL,30H
ADD AL,BL ;ADD 2 DIGITS TOGETHER TO MAKE ONE 2 DIGIT NUMBER. ie 1
AND 2 COMBINED TO MAKE 12
MOV NUM,AL
AND AL,09H ;CHECK WHETHER THE BIT 4 AND BIT 1 IS 1?
CMP AL,09H
JNE L121 ;IF NOT GOTO CHECK BIT 2 AND BIT 1 IS 1?
CALL ROUTINE_1 ;CALL ROUTINE 1 IF 4 AND 1 ARE 1
JMP END
L121:
MOV AL,NUM
AND AL,03H
CMP AL,03H ;CHECKING 1 AND 2 ARE 1?
JNE L131 ;IF NOT CHECKING I AND 3 ARE 1?
CALL ROUTINE_1 ;IF 1 AND 2 ARE 1,CALL ROUTINE 1
JMP END
L131:
MOV AL,NUM
AND AL,05H
CMP AL,05H ;CHECK WHETHER 1 AND 3 ARE 1?
JNE L130
CALL ROUTINE_2 ;IF 1 AND 3 ARE 1,THEN CALL ROUTINE 2
JMP END
L130:
MOV AL,NUM
AND AL,05H
CMP AL,0
JNE ALLOTHER
CALL ROUTINE_3 ;IF 1 AND 3 ARE 0, CALL ROUTINE 3
JMP END
ALLOTHER:
CALL ROUTINE_4 ;ELSE CALL ROUTINE 4
END:
HLT
PROC ROUTINE_1 NEAR
PUSH AX
MOV DX,OFFSET M1
MOV AH,9
INT 21H
POP AX
RET
PROC ROUTINE_2 NEAR
PUSH AX
MOV DX,OFFSET M2
MOV AH,9
INT 21H
POP AX
RET
PROC ROUTINE_3 NEAR
PUSH AX
MOV DX,OFFSET M3
MOV AH,9
INT 21H
POP AX
RET
PROC ROUTINE_4 NEAR
PUSH AX
MOV DX,OFFSET M4
MOV AH,9
INT 21H
POP AX
RET
RET
Output Screenshot:
Hope this helps