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

mcs-17 sECTION 2 Jan 2011

The document contains assembly language code to perform sorting and searching operations. It includes code for bubble sort, displaying a sorted array, and binary search. Additional code defines procedures for inputting decimal numbers from the user and outputting decimal numbers to the screen.

Uploaded by

Ratish Pillai
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
97 views

mcs-17 sECTION 2 Jan 2011

The document contains assembly language code to perform sorting and searching operations. It includes code for bubble sort, displaying a sorted array, and binary search. Additional code defines procedures for inputting decimal numbers from the user and outputting decimal numbers to the screen.

Uploaded by

Ratish Pillai
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 23

Section 2: Assembly Language Programming Lab

Ans a: Sorting & searching

.MODEL SMALL

.STACK 64

DATA SEGMENT

KEY DB 04H

NUM DB 05H

ARRAY DB 05H

DB 04H

DB 03H

DB 02H

DB 01H

MID DB 00H

MSG1 DB 'PRESENT$'

MSG2 DB 'ABSENT$'

MSG3 DB 'SORTED LIST > $'

MSG4 DB 'KEY > $'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: CALL CLS

MOV DX,0000H

CALL CURSOR
MOV AX,DATA

MOV DS,AX

;Bubble Sort

MOV DL,NUM ;counter1

LIN1: DEC DL

JZ LOUT1

MOV CL,DL ;counter2

LEA BX,ARRAY ;pointer to first number

LIN2: MOV AL,[BX]

CMP AL,[BX+1]

JS LESS ;ARRAY(I)<ARRAY(I+1)

XCHG AL,[BX+1];

MOV [BX],AL

LESS: INC BX

DEC CL

JNZ LIN2

JMP LIN1

;Display

LOUT1: LEA DX,MSG3

MOV AH,09H

INT 21H

LEA BX,ARRAY

MOV CH,00H

MOV CL,NUM
DISP1: MOV AL,[BX]

MOV AH,AL

PUSH BX

PUSH CX

CALL SHOW

POP CX

POP BX

INC BX

LOOP DISP1

MOV DX,0200H

CALL CURSOR

LEA DX,MSG4

MOV AH,09H

INT 21H

MOV AL,KEY

MOV AH,AL

CALL SHOW

;Binary Search

MOV CX,01H ;lower

MOV DH,00H

MOV DL,NUM ;upper

LOOP1: CMP DX,CX

JC NFOUND
MOV AX,CX

ADD AX,DX

SHR AX,1

MOV MID,AL

LEA BX,ARRAY

ADD BX,AX

DEC BX

MOV AL,[BX]

CMP AL,KEY

JE FOUND

JC LHALF

UHALF: MOV DH,00H

MOV DL,MID

DEC DX

JMP LOOP1

LHALF: MOV CH,00H

MOV CL,MID

INC CX

JMP LOOP1

FOUND: LEA DX,MSG1

MOV AH,09H

INT 21H

JMP HALT

NFOUND: LEA DX,MSG2


MOV AH,09H

INT 21H

HALT: MOV AX,4C00H

INT 21H

;CLEARS SCREEN

CLS: MOV AX,0600H

MOV BH,07H

MOV CX,0000H

MOV DX,184FH

INT 10H

RET

;SET CURSOR

CURSOR: MOV AH,02H

MOV BH,00H

INT 10H

RET

SHOW: MOV BX,AX

AND BX,0F00FH

MOV CL,04H

SHR BH,CL

ADD BX,3030H

MOV AH,02H
MOV DL,BH

INT 21H

MOV AH,02H

MOV DL,BL

INT 21H

MOV AH,02H

MOV DL,' '

INT 21H

RET

CODE ENDS

END START

Ans b:HCF of two nos

.MODEL SMALL

.STACK 100H

.DATA

PROMPT_1 DB 'Enter the value of M = $'

PROMPT_2 DB 0DH,0AH,'Enter the value of N = $'

PROMPT_3 DB 0DH,0AH,'The GCD of M and N is = $'

.CODE

MAIN PROC
MOV AX, @DATA ; initialize DS

MOV DS, AX

LEA DX, PROMPT_1 ; load and display the string PROMPT_1

MOV AH, 9

INT 21H

CALL INDEC ; call the procedure INDEC

PUSH AX ; push AX onto the STACK

LEA DX, PROMPT_2 ; load and display the string PROMPT_2

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: ; jump label

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 @LOOP ; jump to label @REPEAT

@END_LOOP: ; jump label

LEA DX, PROMPT_3 ; load and display the string PROMPT_3

MOV AH, 9

INT 21H

MOV AX, BX ; set AX=BX

CALL OUTDEC ; call the procedure OUTDEC

MOV AH, 4CH ; return control to DOS

INT 21H

MAIN ENDP

;**************************************************************************;

;**************************************************************************;

;------------------------- Procedure Definitions ------------------------;

;**************************************************************************;
;**************************************************************************;

;**************************************************************************;

;------------------------------- INDEC ----------------------------------;

;**************************************************************************;

INDEC PROC

; this procedure will read a number indecimal form

; input : none

; output : store binary number in AX

; uses : MAIN

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: ; jump label

MOV AH, 2 ; set output function

MOV DL, 20H ; set DL=' '

INT 21H ; print a character

@READ: ; jump label

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: ; jump label

MOV CH, 1 ; set CH=1

INC CL ; set CL=CL+1

JMP @INPUT ; jump to label @INPUT

@PLUS: ; jump label

MOV CH, 2 ; set CH=2

INC CL ; set CL=CL+1

@INPUT: ; jump label

MOV AH, 1 ; set input function


INT 21H ; read a character

@SKIP_INPUT: ; jump label

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: ; jump label

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: ; jump label

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: ; jump label

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: ; jump label

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: ; jump label

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: ; jump label

MOV AH, 2 ; set output function

MOV DL, 7H ; set DL=7H

INT 21H ; print a character

XOR CH, CH ; clear CH

@CLEAR: ; jump label

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: ; jump label

CMP CH, 1 ; compare CH with 1

JNE @EXIT ; jump to label @EXIT if CH!=1

NEG BX ; negate BX

@EXIT: ; jump label

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

;**************************************************************************;

;-------------------------------- OUTDEC --------------------------------;


;**************************************************************************;

OUTDEC PROC

; this procedure will display a decimal number

; input : AX

; output : none

; uses : MAIN

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

;**************************************************************************;

;--------------------------------------------------------------------------;

;**************************************************************************;

END MAIN

;**************************************************************************;

;**************************************************************************;

;------------------------------ THE END ---------------------------------;

;**************************************************************************;

;**************************************************************************;

Ans c:Largest & smallest in an array of 10

CODE SEGMENT

MOV AX,DATA

MOV DS,AX ; initialize DS

MOV DI, OFFSET ARRAY ; DI points to the array

MOV AX, [DI] ; AX contains the first element

MOV LARGEST, AX ; initialize largest

MOV SMALLEST, AX ; initialize smallest

MOV CX,10 ; loop counter


A1: MOV AX, [DI] ; get array value

CMP AX, SMALLEST ; [DI] = smallest?

JGE A2 ; yes : skip

MOV SMALLEST, AX ; no : move [DI] to smallest

JMP A3 ; as it is smallest, thus no need

; to compare it with the largest . i

A2: CMP AX,LARGEST ; [DI] = largest

JLE A3 ; yes : skip

MOV LARGEST, AX ; no : mov [Dl] to largest

A3: ADD DI,2 ; point to next number

LOOP A1 ; repeat the loop until CX = 0

MOV AX, 4C00h

INT 21h ; halt, return to DOS

CODE ENDS

DATA SEGMENT

ARRAY DW -1, 2000, -4000, 32767, 500, 0

LARGEST DW ?

SMALLEST DW ?

DATA ENDS
END

Ans d: String palindrome

.MODEL SMALL

.STACK 64

DATA SEGMENT

MSG DB 'ENTER STRING TO BE CHECKED FOR PALINDROME > $'

MSG1 DB 'YES ,A PALINDROME $'

MSG2 DB 'NOT A PALINDROME $'

STRING LABEL BYTE

MAXLEN DB 20

STRLEN DB ?

STRFLD DB 20 DUP(' ')

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

CALL CLS ;clear screen

CALL CURSOR ;set cursor at (0,0)

CALL READ
CALL CLS

CALL CURSOR

LEA BX,STRFLD

MOV CH,00H

MOV CL,STRLEN

CMP CX,02H

JC PAL

MOV DX,BX

ADD DX,CX

DEC DX

SHR CX,1

AGAIN: MOV AL,[BX]

XCHG BX,DX

CMP AL,[BX]

JNE NOTPAL

XCHG BX,DX

INC BX

DEC DX

LOOP AGAIN

PAL: MOV AH,09H

LEA DX,MSG1

INT 21H
JMP HALT

NOTPAL: MOV AH,09H

LEA DX,MSG2

INT 21H

HALT: MOV AX,4C00H ;terminate program

INT 21H

;CLEARS SCREEN

CLS: MOV AX,0600H

MOV BH,07H

MOV CX,0000H

MOV DX,184FH

INT 10H

RET

;SET CURSOR

CURSOR: MOV DX,0000H

MOV AH,02H

MOV BH,00H

INT 10H

RET
READ: MOV AH,09H ;display message

LEA DX,MSG

INT 21H

MOV AH,0AH

LEA DX,STRING

INT 21H

RET

WRITE: MOV AH,09H

LEA DX,STRFLD

INT 21H

RET

CODE ENDS

END START

You might also like