cse mpi lab manual r 09 (2011)

83
1. INTRODUCTION The first microprocessors that became available with limited instructions sets and thus restricted computing abilities. Although they were suitable for use in electronic calculators, they simply did not have the power needed to operate more complex systems, such as guidance systems or scientific applications. Even some of the early microprocessors had limited capabilities because of the lack of addressing nodes and instruction types. Eight-bit machines are more advanced than previous microprocessors, but they still did not passes multiply and divide instructions. How instruction and time consuming to save to write a program to do these operations. Within the last decade, microprocessor technology has improved tremendously. Thirty two hit processors can now multiply and divide, operate on many different data types (4-8-16-32 bit numbers), and addressed billions of bytes of information. Intel launched its first full-fledged 32-bit microprocessor, the 80386 (or i386), in 1985. It was actually not quite the first 32-bit system announced by Intel. Intel had announced a 32-bit system, the 432 (unrelated to the x86 family), in the early eighties. It was never commercially marketed, and it was withdrawn in 1984. Intel also features the 80376, which is a 32-bit processor (80386 architecture) with a 16-bit external data bus, intended for implementation as an embedded, lower- cost processor. The 80386 was followed in 1989 by the 80486 (or i486), which reached 66 MHz operation in its i486 DX2 1

Upload: maruthi-chinnam

Post on 26-Oct-2014

138 views

Category:

Documents


3 download

TRANSCRIPT

1. INTRODUCTION

The first microprocessors that became available with limited instructions sets and thus

restricted computing abilities. Although they were suitable for use in electronic calculators,

they simply did not have the power needed to operate more complex systems, such as

guidance systems or scientific applications. Even some of the early microprocessors had

limited capabilities because of the lack of addressing nodes and instruction types.

Eight-bit machines are more advanced than previous microprocessors, but they still did

not passes multiply and divide instructions. How instruction and time consuming to

save to write a program to do these operations.

Within the last decade, microprocessor technology has improved tremendously. Thirty two

hit processors can now multiply and divide, operate on many different data types (4-8-16-32

bit numbers), and addressed billions of bytes of information.

Intel launched its first full-fledged 32-bit microprocessor, the 80386 (or i386), in 1985. It was

actually not quite the first 32-bit system announced by Intel. Intel had announced a 32-bit

system, the 432 (unrelated to the x86 family), in the early eighties. It was never commercially

marketed, and it was withdrawn in 1984. Intel also features the 80376, which is a 32-bit

processor (80386 architecture) with a 16-bit external data bus, intended for implementation as

an embedded, lower-cost processor. The 80386 was followed in 1989 by the 80486 (or i486),

which reached 66 MHz operation in its i486 DX2 model. The i486 has an on-chip FPU, an

on-chip 8-kbyte cache, while maintaining the same architecture as the i386. The last

announced (in 1993) member of the Intel x86 family is the Pentium. In the past, during the

development stages, it was sometime referred to as i586 or P5, but Intel decided to name it

Pentium, without any numerical assignment. While maintaining the x86 family architecture,

the Pentium was extended to be a two-issue super scalar (two instruction fetched, decoded,

and executed in parallel), has a double 64-bit data bus in and out of chip, and a dual 16-kbyte

on-chip cache (8-kbyte instruction, 8-kbyte data). The Pentium is a 0.8 micron BiCMOS

Technology, three layer metal, 273- pin grid array package microprocessor.

1

Instruction Set:

The instruction set is indeed one of the key features of computer architecture, defining and

describing the capabilities of any computing system, including microprocessors. It constitutes

a specific set of operations that a given system can perform. We can usually distinguish the

following principal types of instruction.

1. Data movement instructions.

2. Integer arithmetic and logic instructions.

3. Shift and rotate instructions.

4. Control transfer instructions.

5. Bit manipulation instructions.

6. System control instructions.

7. Floating point instructions.

8. Special function unit instructions.

New Pentium instructions:

Instruction Function

CMPXCHG8B Compare and exchange eight bytes

CPUID Return the CPU identification code

RDTSC Read time stamp counter

RDMSR Read model specific register

WRMSR Read model specific register

RSM Return from system management interrupt

Assembler Reference: Microsoft MASM version 6.11 contains updated software capable of

processing printing instructions. Machine codes and instruction cycle counts are generated by

MASM for all instructions on each processor beginning with 8086. To assemble the file

PROG.ASM use this command: (better to use DOS command line)

MASM PROG.ASMThe MASM Program wjll assemble the PROG.ASM file. ( To create PROG.OBJ from PROG.ASM) To create PROG.EXE from PROG.OBJ, use this LINK command:

LINK PROG.OBJWhich converts the contents of PROG.OBJ into PROG.EXE.

To link more than one object file use + signs between their file names as in:

LINK PA+PB+PC;

The following is a list of MASM reserved words:

ASSUME sume definition

2

BYTE e (as in BYTE PTR)

CODE begin code segment

DATA begin data segment DB define byte

DD define double-word

DQ define quad word

DS define storage

DUP duplicate

DW define word

ELSE else statement

END end program

ENDIF end if statement

ENDM end macro

ENDP end procedure

ENDS end segment

EQU equate

.EXIT generate exit code

EXTRN external reference

FAR far reference

IF if statement

MACRO define macro

.MODEL model type

NEAR near reference

OFFSET offset

ORQ origin

PARA paragraph

PROC define procedure

PTR pointer

PUBLIC public reference

SEG locate segment

SEGMENT define segment

.STARTUP generate startup code

WORD word (as in WORD PTR)

.286 selects the 286 instruction set

.386 selects the 386 instruction set

3

.486 selects the 486 instruction set .

586 selects the 586 instruction set

MASM ( The Microsoft Macro Assembler ) MASM is used for The Microsoft Macro Assembler (abbreviated MASM) is an assembler for the 8086 family of microprocessors. It was originally produced by Microsoft for development work on their MS-DOS operating system, and was for some time the most popular assembler available for that operating system. It supported a wide variety of macro facilities and structured programming idioms, including high-level constructions for looping, procedure calls. MASM is an example of a high-level assemblerThe example program template:

(a) Go to Start – Run(b) Type cmd

Microsoft Windows XP [Version 5.1.2600](C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\SNIST>(c) A command prompt D:8086> is displayed (d) To start writing a new program type the key word ‘EDIT’(e) Structure of the program

; To execute _______ program data Segment

…………..…………..

data endscode segmentassume cs:code,ds:data,es:data

---------------------------------

int 3Hcode endsend start

Using Debug to execute and 8Ox 86 program:

DEBUG is a utility program that allows a user to load an 8Ox86 program into 111emory and

execute it step by step. DEBUG displays the contents of all processor registers after each

instruction executes, allowing the user to determine if the code is performing the desired task.

DEBUG only displays the 16-bit portion of the general purpose registers. Code view is

capable of displaying the entire 32 bits. DEBUG is a very useful debugging tool. We will use

DEBUG to step through a number of simple programs, gaining familiarity with DEBUG's

commands as we do so. DEBUG contains commands that can display and modify memory,

4

assemble instructions, disassemble code already placed into memory, trace through single or

multiple instructions, load registers with data, and do much more.

DEBUG loads into memory like any other program, in the fist available slot. The memory

space used by DEBUG for the user program begins after the end of DEBUG's code. If

an .EXE or .COM file were specified, DEBUG would load the program according to

accepted DOS conventions.

To execute the program file PROG.EXE use this command:

DEBUG PROG.EXE

DEBUG uses a minus sign as its command prompt, so you should see a "-" appear on

display.

To get a list of some commands available with DEBUG is:

T trace (step by step execution)

U un assemble

D dump

G go (complete execution)

H Hex

To execute the program file PROG.ASM use the following procedure:

. MASM PROG.ASM

. LINK PROG.OBJ

. DEBUG PROG.EXE

Working on 8086/88 Microprocessor kit:Procedure to type a program:

1. Press RST button2. Type ‘A’ after # symbol and press enter3. Type 1000 after starting address is requested on screen and press enter4. Enter mnemonics and press double enter5. Press INT after typing the program

Procedure to execute a program:1. Press INT2. # GO 1000 (starting address)3. Press Enter ( displays as ……executing)

Procedure to Check the result:1. Press RST2. #SB 1500 (address location given in program to see the result)3. Press Enter4. Enter to Check the next address

5

in KIT:#R : used for viewing the registers#SB : Show Byte#GO(Starting Address): used for executing the program#A: Indicates the starting of entering the program

6

Memory models for the assembler:

Model Type Description

Tiny All data and code must fit into one segment.

Small This model contains two segments: one data segment of 64K bytes and

one code segment of 64K bytes.

Medium This model contains one data segment of 64K bytes and any number of

code segments for large programs.

Compact One code segment contains the program, and any number of data

segments contain the data.

Large The large model allows any number of code and data segments.

Huge This model is the same as, large, but the data segment s may contain

more than 64K bytes each.

Flat Only available to MASM 6.X. The flat model uses one segment of

512K bytes to store all data and code.

7

2. ARITHMETIC OPERATIONS

AIM : TO ILLUSTRATE MULTIBYTE ARITHMETIC OPERATIONS

NOTE: students are expected to draw the flowchart and proceed for the program accordingly

Examples:

1) ;MULTIBYTE ADDITION DATA SEGMENT

A DB 09H,06H,03H,04H,06H,08H,06H,02H B DB 01H,02H,03H,01H,02H,03H,04H,0AH COUNT DW 08H SUM DB 25 DUP(0)

DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA

START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX,COUNT MOV SI,OFFSET A MOV DI,OFFSET B

MOV BX,OFFSET SUM

GO BACK: MOV AL,[SI] ADC AL,[DI] INC SI INC DI

MOV [BX],AL INC BX DEC CX JNZ GO BACK

INT 3H

CODE ENDS END START

2) ;MULTIBYTE SUBTRACTION DATA SEGMENT

A DB 09H,06H,03H,04H,06H,08H,06H,02H B DB 01H,02H,03H,01H,02H,03H,04H,0AH COUNT DW 08H SUM DB 25 DUP(0)

DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA

START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX,COUNT MOV SI,OFFSET A MOV DI,OFFSET B

MOV BX,OFFSET SUM

8

GO BACK: MOV AL,[SI] SBB AL,[DI] INC SI INC DI

MOV [BX],AL INC BX DEC CX JNZ GO BACK

INT 3H

CODE ENDS END START

3) ;8086 MICROPROCESSOR ;ARITHMETIC OPERATIONS ;REGISTERS:AX,BX,CX,DX,DS,CS ;PROCEDURE:NONE ;PORT:NONE ;PROGRAM FOR MULTIBYTE MULTIPLICATION DATA SEGMENT NUM1 DW 1111H,1111H NUM2 DW 1111H,1111H NUM3 DW 4 DUP(0) DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE MOV AX,DATA ;STARTING ADDRESS OF DATA SEGMENT MOV DS,AX

MOV AX,NUM1 ;NUM1 X NUM2 MUL NUM2 ;UNIT PLACE X UNIT PLACE=UNIT RESULT MOV NUM3,AX MOV CX,DX

MOV AX,NUM1+2 ;NUM1+2 X NUM2 MUL NUM2 ;UNIT PLACE X TEN PLACE=TEN RESULT ADD CX,AX MOV BX,DX

MOV AX,NUM1 ; NUM1 X NUM2+2 MUL NUM2+2 ; TEN PLACE X UNIT PLACE=TEN RESULT ADD CX,AX MOV NUM3+2,CX ADC BX,DX

MOV AX,NUM1+2 ; NUM1+2 X NUM2+2 MUL NUM2+2 ; TEN PLACE X TEN PLACE=100 RESULT ADD AX,BX MOV NUM3+4,AX MOV NUM3+6,DX

INT 3H CODE ENDS

END

4) ;WRITE AN ALP FOR MATRIX ADDITION

DATA SEGMENT DIM EQU 09H

9

MAT1 DB 09,08,04,05,06,07,08,09,09 MAT2 DB 01,02,03,04,05,02,03,08,03 RMAT3 DW 09 DUP(?) DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV CX,DIM MOV SI,OFFSET MAT1 MOV DI,OFFSET MAT2 MOV BX,OFFSET RMAT3 NEXT: XOR AX,AX MOV AL,[SI] ADD AL,[DI] MOV WORD PTR [BX],AX INC SI INC DI ADD BX,02 LOOP NEXT INT 03H CODE ENDS END START

5) ;WRITE AN ALP FOR MATRIX SUBTRACTION

DATA SEGMENT DIM EQU 09H MAT1 DB 09,08,04,05,06,07,08,09,09 MAT2 DB 01,02,03,04,05,02,03,08,03 RMAT3 DW 09 DUP(?) DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV CX,DIM MOV SI,OFFSET MAT1 MOV DI,OFFSET MAT2 MOV BX,OFFSET RMAT3 NEXT: XOR AX,AX MOV AL,[SI] SUB AL,[DI] MOV WORD PTR [BX],AX INC SI INC DI ADD BX,02 LOOP NEXT INT 03H CODE ENDS END START

10

6) ;ASCII ARTHMETIC ;PROGRAM FOR ASCII DIVISION CODE SEGMENT ASSUME CS:CODE MOV AL,'7' ; LSB OF DIVIDEND=AL=37H MOV AH,'6' ; MSB OF DIVIDEND=AH=36H AND AX,0F0FH ; 0607H MOV CH,'9' ; DIVISOR CH=39H AND CH,0FH ; CH=09H AAD ; AX=AL/BL=67/9 QUO=07 REM=04 DIV CH OR AX,3030H INT 3H CODE ENDS END

7) ;ASCII ARTHMETIC ;PROGRAM FOR ASCII MULTIPLICATION CODE SEGMENT ASSUME CS:CODE MOV AL,'9' ; AL=39H MOV BL,'9' ; BL=39H AND AL,0FH ; AL=09H AND BL,0FH ; BL=09H MOV AH,00H ; AH=00H MUL BL ; AX=AL/BL=09H+09H=51H =81D AAM OR AX,3030H INT 3H CODE ENDS END

11

3. LOGICAL OPERATIONS

AIM: TO ILLUSTRATE LOGICAL OPERATIONS

NOTE: students are expected to draw the flowchart and proceed for the program accordingly

Examples:

1) ;8086 MICROPROCESSOR ;LOGICAL OPERATION ;WRITE AN ALP FOR PACKED BCD TO ASCII CONVERSION ;REGISTER:AX,BX,CX,DX ;PROCEDURE:NONE ;PORT:NONE DATA SEGMENT PACKBCD DB 59H ASCII1 DB ? ASCII2 DB ? CODE SEGMENT ASSUME CS:CODE START:MOV AX,DATA MOV DS,AX MOV AL,PACKBCD ;AL=59H MOV BL,AL ;BL=59H AND AL,0F0H ;AL=50H AND BL,0FH ;BL=09H MOV CL,4 ROR AL,CL ;AL=05H OR AL,30H ;AL=35H OR BL,30H ;BL=39H MOV ASCII1,BL MOV ASCII2,AL MOV AX,4C00H INT 21H CODE ENDS END START

12

4. STRING OPERATIONS

AIM: TO ILLUSTRATE VARIOUS STRING OPERATIONS

NOTE: students are expected to draw the flowchart and proceed for the program accordingly

Examples:

1) ;8086 MICROPROCESSOR ;BY USING STRING OPERATION AND INSTRUCTION PREFIX ;WRITE AN ALP FOR MOVE A BLOCK OF STRING ;REGISTERS:AX,BX,CX,DX,SI,DI,ES,DS ;PROCEDURE:NONE ;PORT:NONE DATA SEGMENT STRINGA DB 'MICROPROCESSOR' STRINGB DB 25 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA

START:MOV AX,DATA MOV DS,AX MOV ES,AX MOV BX,0000H MOV CX,14 LEA SI,STRINGA ;STARTING ADDRESS OF STRING-A LEA DI,STRINGB ;STARTING ADDRESS OF STRING-B CLD REP MOVSB MOV BX,9999H ;BX=BLOCK IS MOVED MOV AX,4C00H INT 21H

CODE ENDS END START

2) ;8086 MICROPROCESSOR ;BY USING STRING OPERATION AND INSTRUCTION PREFIX ;WRITE AN ALP FOR REVERSE OF A STRING ;REGISTERS:AX,BX,CX,DX,SI,DI,ES,DS ;PROCEDURE:NONE ;PORT:NONE DATA SEGMENT STRINGA DB 'MICROPROCESSOR' STRINGB DB 25 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV BX,0000H

13

MOV CX,14 LEA SI,STRINGA LEA DI,STRINGB+13

GOBACK: MOV AL,[SI] MOV [DI],AL INC SI DEC DI

LOOP GOBACK INT 03H

CODE ENDS END START

3) ;8086 MICROPROCESSOR ;BY USING STRING OPERATION AND INSTRUCTION PREFIX ;WRITE AN ALP TO SORTING IN ASCENDING ORDER ;REGISTERS:AX,BX,CX,DX,SI,DI,ES,DS ;PROCEDURE:NONE ;PORT:NONE

DATA SEGMENT ARR DB 99H,88H,77H,66H,55H,44H COUNT DW 0006H DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA

START:MOV AX,DATA ;STARTING ADDRESS OF DATA SEGMENT MOV DS,AX MOV ES,AX ;STARTING ADDRESS OF EXTRA SEGMENT MOV DX,COUNT ;NO OF ELEMENT IN AN ARRAYS=6 DEC DX NXTITER:MOV CX,DX ;NO OF COMPARISION=5 MOV SI,0

NXTCMP: MOV AL,ARR[SI] CMP AL,ARR[SI+1] ;COMPARE TWO ELEMENTS JC NOSWAP ;CARRY=SET INDICATES 1ST ELEMENT IS SMALLEST XCHG AL,ARR[SI+1] ; SWAPPING OF 2 ELEMENTS MOV ARR[SI],AL

NOSWAP: INC SI ; GO COMPARE FOR 2 AND 3 ELEMENT LOOP NXTCMP DEC DX ; GO FOR NEXT SMALLEST ELEMENT JNZ NXTITER INT 3H ; BREAK AND DISPLAY

CODE ENDSEND START

14

4) ;8086 MICROPROCESSOR ;BY USING STRING OPERATION AND INSTRUCTION PREFIX ;WRITE AN ALP FOR SORTING-DESCENDING ORDERS ;REGISTERS:AX,BX,CX,DX,SI,DI,ES,DS ;PROCEDURE:NONE ;PORT:NONE DATA SEGMENT ARR DW 1111H,2222H,3333H,4444H,5555H,6666H COUNT DW 0006H DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA

START:MOV AX,DATA ;STARTING ADDRESS OF DATA SEGMENT MOV DS,AX MOV ES,AX ;STARTING ADDRESS OF EXTRA SEGMENT MOV DX,COUNT ;NO OF ELEMENT IN AN ARRAYS=6 DEC DX NXTITER:MOV CX,DX ;NO OF COMPARISION=5 MOV SI,0 NXTCMP:MOV AX,ARR[SI] CMP AX,ARR[SI+2] ;COMPARE TWO ELEMENTS JNC NOSWAP ;CARRY=CLEAR INDICATES 1ST ELEMENT IS LARGE XCHG AX,ARR[SI+2] ;SWAPPING OF 2 ELEMENTS XCHG AX,ARR[SI+2] MOV ARR[SI],AX NOSWAP:INC SI INC SI ; GO COMPARE FOR 2 AND 3 ELEMENT LOOP NXTCMP DEC DX ; GO FOR NEXT SMALLEST ELEMENT JNZ NXTITER INT 3H ; BREAK AND DISPLAY CODE ENDS END START

15

5) ;8086 MICROPROCESSOR ;WRITE AN ALP FOR FINDING THE LENGTH OF STRING ;REGISTERS:AX,SI,CX,DS,ES ;PROCEDURE:NONE

DATA SEGMENT STRING DB 'MICROPROCESSOR',0 LEN DW ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA

START: MOV AX,DATA ;STARTING ADDRESS OF DATA SEGMENT MOV DS,AX MOV ES,AX ;STARTING ADDRESS OF EXTRA SEGMENT MOV AX,0000H ; SEARCH SPACE MOV CX,256 LEA DI,STRING CLD ; INCREMENT SI/DI REPNE SCASB ; CMP AL,[DI] JZ FOUND

MOV BX,5555H ; BX=5555H INDICATES NOT FOUND MOV AX,4C00H INT 21H FOUND: DEC DI MOV LEN,DI ; BX=9999H INDICATES FOUND MOV BX,9999H ; LEN=DI =STRING LENGTH MOV AX,4C00H ; EXIT TO DOS INT 03H

CODE ENDS END START ; IGNORE NEXT INSTRUCTION

16

6) ;8086 MICROPROCESSOR ;BY USING STRING OPERATION AND INSTRUCTION PREFIX ;WRITE AN ALP FOR COMPARE TWO STRINGS ;REGISTERS:AX,BX,CX,DX,SI,DI,ES,DS ;PROCEDURE:NONE ;PORT:NONE

DATA SEGMENT STRINGB DB 'MICROPROCESSOR',0 STRINGA DB 'MICROPROCESSOR' ACTLEN DW 000EH DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX,256 LEA SI,STRINGA LEA DI,STRINGB MOV AL,00H REPNE SCASB DEC DI MOV BX,DI CMP ACTLEN,BX JZ CMP2STR MOV DX,2222H INT 3H

CMP2STR: LEA SI,STRINGA LEA DI,STRINGB MOV CX,ACTLEN CLD REPE CMPSB JNZ NOTMATCH MOV DX,9999H INT 3H

NOTMATCH: MOV AX,0000H INT 3H

CODE ENDSEND START

17

7) ;8086 MICROPROCESSOR ;Program to verify the password ;REGISTERS:AX,BX,CX,DX,SI,DI,ES,DS ;PROCEDURE:NONE

DATA SEGMENT

PASSWORD DB ‘FAILSAFE’ ; Password

STR_LENGTH EQU ($ - PASSWORD); Compute length of string

INPUT_WORD DB 8 DUP (0); Space for user password input

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, ES:DATA

MOV AX, DATA

MOV DS, AX ; Initialize data segment resister

MOV ES, AX ; Initialize extra segment resister

MOV DX, OFFFEH ; These next three instructions

MOV AL, 99H ; set up an output port on

OUT DX, AL ; the SDK board

LEA SI, PASSWORD ; Load source poinetr

LEA DI, INPUT_WORD ; load destination pointer

MOV CX, STR_LENGTH ; Load counter with password length

CLD ; Increment DI & SI

REPE CMPSB ; Compare two string bytes

JNE SOUND_ALARM ; If not equal sound alarm

JMP OK ; else continue

SOUND_ALARM: MOV AL, 01 ; To sound alarm, send a 1

MOV DX, 0FFFAH ; to the output port whose

OUT DX, AL ; address is in DX

HLT ; and HALT

OK: NOP ; Prog. continues if password is ok

CODE ENDS

END

18

5. MODULAR PROGRAMMING

AIM: TO ILLUSTRATE VARIOUS MODULAR PROGRAMMING OPERATIONS

NOTE: students are expected to draw the flowchart and proceed for the program accordingly Examples:

1) ;FACTORIAL OF A GIVEN NUMBER DATA SEGMENT ARR1 DW 1 ARR2 DW 5 DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA MOV DS,AX MOV AX,ARR1 MOV BX,ARR2

FACT: MUL BX DEC BX JNZ FACT INT 3H

CODE ENDSEND START

2) ; WRITE AN ALP FOR SUM OF SQUARES OF N.NUMBERS DATA SEGMENT COUNT DW 0003H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA

MOV DS,AX MOV AX,0H MOV BX,0H MOV CX,0H MOV DX,0H MOV CX,COUNT CALL SUMSQR MOV DX.BX INT 3H

SUMSQR PROC NEAR SQR: MOV AX,CX

MUL CX ADD BX,AX DEC CX JNZ SQR RET

SUMSQR ENDP

CODE ENDS

END START

19

3). ;WRITE AN ALP FOR SQUARE ROOT OF A GIVEN NUMBER

DATA SEGMENT NUM DB 25 RESULT DB (?) DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CL,NUM MOV BL,01 MOV AL,00 UP: CMP CL,00 JZ ZRESULT SUB CL,BL INC AL ADD BL,02 JMP UP ZRESULT: MOV RESULT,AL INT 03H CODE ENDS END START

4) ; WRITE AN ALP FOR AVERAGE OF GIVEN NUMBERS

DATA SEGMENT VALUES DW 03H,08H,05H,08H N DW 04H RES DW (?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV CX,N MOV AX,0 MOV BX,N AVG:ADD AX, VALUES[SI] INC SI INC SI LOOP AVG DIV BX MOV RES,AX INT 3H CODE ENDS END START

20

6. DOS AND BIOS PROGRAMMING

AIM: TO ILLUSTRATE VARIOUS DOS AND BIOS PROGRAMMING OPERATIONS

NOTE: students are expected to draw the flowchart and proceed for the program accordingly

Examples:

1) ;8086 MICROPROCESSOR ;BY USING DOS AND BIOS PROGRAMMING OPERATIONS ;WRITE AN ALP TO DISPLAY THE GIVEN TWO STRINGS ;REGISTERS:AX,BX,CX,DX,SI,DI,ES,DS ;PROCEDURE:NONE ;PORT:NONE

DATA SEGMENTMESSAGE1 DB 0AH,0DH,'THIS IS EEE DEPARTMENT',0AH,0DH, "$"MESSAGE2 DB 0AH,0DH,'SREE NIDHI COLLEGE OF ENGINEERING',0AH,0DH,"$"DATA ENDS

CODE SEGMENTASSUME DS:DATA,CS:CODESTART:

MOV AX,DATA MOV DS,AX MOV SI,OFFSET MESSAGE1 MOV AH,09H INT 21H MOV DX,OFFSET MESSAGE2 MOV AH,09H INT 21H INT 3H

CODE ENDS END START

2) ;8086 MICROPROCESSOR ;BY USING DOS AND BIOS PROGRAMMING OPERATIONS ;WRITE AN ALP TO DISPLAY THE STRINGS MATCHING OR NOT ;REGISTERS:AX,BX,CX,DX,SI,DI,ES,DS ;PROCEDURE:NONE ;PORT:NONE

DATA SEGMENT

STRINGA DB 'MICROPROCESSOR',0,0,0

STRINGB DB 'MICROPROCESSOR'

ACTLEN DW 000EH

MESSAGE1 db 0AH,0DH,"STRINGS ARE MATCHING",0AH,0DH,"$"

MESSAGE2 db 0AH,0DH,"STRINGS ARE NOT MATCHING",0AH,0DH,"$"

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA

21

START: MOV AX,DATA

MOV DS,AX

MOV ES,AX

LEA SI,STRINGA

LEA DI,STRINGB

MOV CX,ACTLEN

CLD

REPE CMPSB

JNZ NOTMATCH

MATCH: MOV DX,OFFSET MESSAGE1

MOV Ah,09h

INT 21h

INT 3h

NOTMATCH: MOV DX,OFFSET MESSAGE2

MOV AH,09h

INT 21H

INT 3H

CODE ENDS

END START

3) ;8086 MICROPROCESSOR ;BY USING DOS AND BIOS PROGRAMMING OPERATIONS ;WRITE AN ALP TO DISPLAY THE REVERSE OF A STRING ;REGISTERS:AX,BX,CX,DX,SI,DI,ES,DS ;PROCEDURE:NONE ;PORT:NONE

DATA SEGMENT

STRINGA DB 'MICROPROCESSOR',0,0

STRINGB DB 0AH,0DH,"$",'50 DUP(0)',0AH,0DH,"$"

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, ES:DATA

START: MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV BX,0000H

MOV CX,14

LEA SI,STRINGA

LEA DI,STRINGB+13

GOBACK: MOV AL,[SI]

MOV [DI],AL

INC SI

22

DEC DI

LOOP GOBACK

JZ AHEAD

MOV AX,SI

MOV AH,09

INT 21H

AHEAD: MOV DX,DI

MOV AH,09

INT 21H

INT 3H

CODE ENDS

END START

4) ;8086 MICROPROCESSOR ;BY USING STRING OPERATION AND INSTRUCTION PREFIX ;WRITE AN ALP TO DISPLAY AND FIND WHETHER A STRING IS PALINDROME OR NOT ;REGISTERS:AX,BX,CX,DX,SI,DI,ES,DS ;PROCEDURE:NONE ;PORT:NONE

DATA SEGMENT

STRA DB 'madam'

STRB DB 25 DUP(0)

PAL DB 'STRING IS PALINDROME',0AH,0DH,"$"

NOTPAL DB 'STRING IS NOT PALINDROME',0AH,0DH,"$"

COUNT DW 0005H

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA

START: MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV BX,0000

MOV CX,COUNT

LEA SI,[STRA]

LEA DI,[STRB+0004]

GOBACK: MOV AL,[SI]

MOV [DI],AL

INC SI

DEC DI

LOOP GOBACK

LEA SI,STRA

LEA DI,STRB

23

MOV CX,COUNT

CLD

REPE CMPSB

JNZ NOTMATCH

MOV AX,OFFSET PAL

MOV AH,09

INT 21H

INT 3H

NOTMAT: MOV DX,OFFSET NOTPAL

MOV AH,09

INT 21H

INT 3H

CODE ENDS

END START

24

7. INTERFACING 8255 PPI WITH 8086

Aim: To interface 8255 study card implement various modes of operation

25

26

27

28

29

30

31

32

33

34

35

36

37

38

8. INTERFACE 8279 CARD WITH 8086

Aim: To interface 8279 study card with 8086 and illustrate various modes of

operation

39

40

41

42

43

44

45

46

47

Example: 4 CLEAR THE DISPLAY

48

9. INTERFACE OF 8259 WITH 8086

Aim: To interface 8259 study card with 8086

49

50

51

52

53

54

55

56

57

58

59

60

10. STEPPER MOTOR INTERFACING

Aim : To interface the stepper motor and rotate it using microprocessor

Circuit description: The stepper motor interface uses four transistor pairs (SL 100 and 2N3055) darlington pair configuration. Each configuration pair is used to excite the particular winding of the motor connected to 4 pin connector on the interface. The inputs to these transistors are from the 8255 PPI I/O lines of trainer kit. The free wheeling diode across each winding protects transistor from switching transients.

Example

OUTPUT 2500AD SYMBOLS ON ORG 2000H MOV AL,80H ;INITIALIZE 8255 MOV DX,0FFE7H ;ALL PORTS ARE OUTPUT OUT DX,AL ; 0FFE7H INDICATES ADDRESS OF CWR

MOV AL,88H ; PA3-PA0 ARE CONNECTED TO 4 FIELD GO:MOV DX,0FFE1H ; 0FFE1H INDICATE PORT A ADDRESS OUT DX,AL ; 1=ON AND 0=OFF CALL DELAY ; DELAY BETWEEN FIELDS ROR AL,1 JNZ GO ; ROTATE CONTINOUSLY INT 3H

DELAY:MOV CX,0FFFH LOOP1:NOP NOP LOOP LOOP1 RET

END

61

11.TRAFFIC LIGHT CONTROLLER

1. AIM: To simulate the control operation of traffic signals using a

microcontroller.

2. Introduction:

The traffic light interface simulates the control and operation of traffic signals at a

junction. The interface provides a LED indicators in all directions. All these LED's

controlled by microc()ntroJler through 8255 port Jines.

3. Description of a interface:

The interface provides, the combinations of red, amber & green LED'S are to indicate

halt, wait and go signals for vehicles.

At the left comer of each road, a group of five LEDs (red, amber & 3 green); are

arranged in the form of a T-section to control the traffic of that road. Each road is

named as North (N), South (S), East (E) & West (W). LEDs LI, LIO, Ll9 & U8 (red)

are for stop signal for the vehicles on the N, S, E & W respectively. L2, LII, L20 &

L29 (amber) indicate wait state for vehicles on the road N, S, E & W respectively. L3.

L4, & L5 (green) are for left, straight, & right turn; for the vehicles on the road S.

SimilarJy L12-L13-LI4, L23-L22-L21 & L32-L31-L30 simulates same function for

the roads, E, N & W respectively. A total of 16 LED's (2 red & 2 green at each road)

are provided for pedestrians crossing. L7-L9, LI6-LI8, L25-L27 & L34-L36 (green)

when ON allows pedestrians; to cross and L6-L8, L15-LI7, L24-L26 & L33-L35 (red)

when ON allows the pedestrians to wait.

At the beginning of the program all red LEDs' are switched ON and all other LEOs

are switched OFF. Amber LEO is switched on before switching over, to proceed state

from halt state.

62

LED connection details are given below:

LI PCO Ll9 PCI

L2 PAO L20 PBO

L3 PAl L21 PBI

L4 PA2 L22 PB2

L5 PA3 L23 PB3

L6 PC4 L24 PC6

L7 PC4 L25 PC6

L8 PC4 L26 PC6

L9 PC4 L27 PC6

LIO PC2 L28 PC3

LII PA4 L29 PB4

Ll2 PA5 L30 PB5

Ll3 PA6 L31 PB6

Ll4 PA7 L32 PB7

Ll5 PC5 L33 PC7

Ll6 PC5 L34 PC7

L17 PC5 L35 PC7

Ll8 PC5 L36 PC7

Using above procedure user can write the program to simulate the traffic in any desired

fashion.

63

code

OUTPUT 2500AD SYMBOLS ON ORG 0:4000H ASSUME CS:CODE MOV AL,80H ;PORTA,PORTB,PORTC ARE OUTPUT MOV DX,0FFE6H ; 0FFE6H CONTAINS THE ADDRESS OF CWR OF 8255PPI OUT DX,AL

JAD:MOV AL,88H ;NORTH GREEN -------->COND-1 MOV DX,0FFE0H OUT DX,AL MOV AL,83H MOV DX,0FFE2H OUT DX,AL MOV AL,0F2H MOV DX,0FFE4H OUT DX,AL CALL DELAY CALL DELAY CALL DELAY

64

MOV AL,88H ;NORTH AMBER WEST AMBER---->COND-2 MOV DX,0FFE0H OUT DX,AL MOV AL,44H MOV DX,0FFE2H OUT DX,AL MOV AL,0F0H MOV DX,0FFE4H OUT DX,AL CALL DELAY CALL DELAY CALL DELAY

MOV AL,88H ;WEST GREEN-------------->COND-3 MOV DX,0FFE0H OUT DX,AL MOV AL,38H MOV DX,0FFE2H OUT DX,AL MOV AL,0F1H MOV DX,0FFE4H OUT DX,AL CALL DELAY CALL DELAY CALL DELAY

MOV AL,84H ;WEST AMBER SOUTH AMBER--->COND-4 MOV DX,0FFE0H OUT DX,AL MOV AL,48H MOV DX,0FFE2H OUT DX,AL MOV AL,0F0H MOV DX,0FFE4H OUT DX,AL CALL DELAY CALL DELAY CALL DELAY

MOV AL,83H ;SOUTH GREEN------->COND-5 MOV DX,0FFE0H OUT DX,AL MOV AL,88H MOV DX,0FFE2H OUT DX,AL MOV AL,0F8H MOV DX,0FFE4H OUT DX,AL CALL DELAY CALL DELAY CALL DELAY

MOV AL,44H ;SOUTH AMBER EAST AMBER-->COND-6 MOV DX,0FFE0H

65

OUT DX,AL MOV AL,88H MOV DX,0FFE2H OUT DX,AL MOV AL,0F0H MOV DX,0FFE4H OUT DX,AL CALL DELAY CALL DELAY CALL DELAY MOV AL,38H ;EAST GREEN--->COND-7 MOV DX,0FFE0H OUT DX,AL MOV AL,48H MOV DX,0FFE2H OUT DX,AL MOV AL,0F4H MOV DX,0FFE4H OUT DX,AL CALL DELAY CALL DELAY CALL DELAY MOV AL,88H ;ALL PED GREEN MOV DX,0FFE0H OUT DX,AL MOV AL,88H MOV DX,0FFE2H OUT DX,AL MOV AL,00H MOV DX,0FFE4H OUT DX,AL CALL DELAY CALL DELAY CALL DELAY

JMP JAD

DELAY:MOV CX,0FFFFH D1:NOP NOP LOOP D1 RET END

66

12. REAL TIME CLOCK INTERFACE

Aim: To interface a real time clock with 8051 (parallel interface)and set the parameters

Introduction: Interfacing the RTC with 8051 through 8255 parallel interface and to set parameters like hours, minutes, seconds etc.Description: manual in RTC you can set time, date, month, year, etc. By setting these things you can read time at any instant and assign different actions should take place at different time since RTC will be running continuously. All this functions of RTC are controlled by cpu this RTC is interfaced to the cpu with the help of 8255 which is present on the kit. And also with the help of 26 core FRC connecting P2 to P1 on the interface.

CODE: : Read rtc OUTPUT 2500AD symbols on

CODE SEGMENT ORG 2300HTBL: DB 09H ; X1 SECONDS ---2300H DB 05H ; X10 SECONDS ---2301H

DB 09H ; X1 MINUTES ---2302H DB 05H ; X10 MINUTES ---2303H

DB 09H ; X1 HOURS ---2304H DB 02H ; X10 HOURS ---2305H

OUTSTRG EQU 0FE00:1B55HOUTBYTE EQU 0FE00:1B64H

ORG 2500H MOV AX,0000H MOV DS,AX MOV ES,AX MOV CS,AX

READ: MOV BL,00H ;BL=ADDRESS MOV SI,0000H ;SI=[ADDRESS] MOV AL,90H ; PA=I/P PB=O/P PC=O/P OF 8255PPI MOV DX,0FFE6H ; 0FFE6H INDICATES CWR ADDRESS OUT DX,AL

MOV AL,10H ; TO MAKE HOLD=1 MOV DX,0FFE4H OUT DX,AL

MOV AL,28H ; DELAY OF 150USEC FOR HOLD=1GOBACK: DEC AL JNZ GOBACK

MOV AL,30H ; HOLD=1 AND READ=1 MOV DX,0FFE4H OUT DX,AL

67

READ1: MOV AL,BL ; BL=ADDRESS=[00]=XS1 MOV DX,0FFE2H ; PB IS CONNECTED TO ADDRESS LINE OF RTC OUT DX,AL

MOV AL,02H ; DELAY FOR READ ACCESS TIMEREADLY: DEC AL JNZ READLY

MOV DX,0FFE0H ; I/P PA IS CONNECTED TO DATA LINES OF RTC IN AL,DX AND AL,0FH ; USE ONLY 4 LSBITS

MOV TBL[SI],AL ; STORE DATA IN 2300H INC BL CMP BL,08H ; GET NEXT ADDRESS OF XS1,XS10,XM1,XM10,XH1 JE STOP2

INC SI ; GET CONTENTS OF ADDRESS JMP READ1 STOP2: MOV AL,00H ; HOLD=1 AND READ=1 MOV DX,0FFE4H OUT DX,AL

REPEAT: MOV BX,2304H ; GET HRS VALUE CALL DATA AND AL,3FH CALL OUTBYTE ; O/P HRS VALUE

; CALL SPACE ; GET MIN VALUE MOV BX,2302H CALL DATA ; O/P MIN VALUE CALL OUTBYTE

; CALL SPACE MOV BX,2300H ; GET SEC VALUE CALL DAT CALL OUTBYTE ; O/P SEC VALUE ; CALL SPACE

CALL REWRT

; MOV CX,29H ;BACK: LEA DX,BAK ; MOV SI,DX ; PUSH CX ; CALL OUTSTRG ; POP CX ; DEC CL ; CMP CL,00H ; JNE BACK JMP REPEAT

DAT: MOV AL,[BX] ; DISPLAY UPDATE VALVES BY REPEATING AND AL,0FH ; ROUTINE TO CLUB THE LOWER NIBBLE MOV DL,AL ; VALUES OF THE MEMORY LOCATION OF 2300H INC BX ; TO 230CH MOV AL,[BX] AND AL,0FH MOV CX,0004H ROL AL,CL

68

OR AL,DL RET

REWRT: MOV BX,2300H ;ROUTINE TO CHECK UPDATING OF THE MOV AL,[BX] ;SECS IN LOCATION 23OOH PUSH AX CALL READ POP AX MOV BX,2300H CMP AL,[BX] JE REWRT RET

SPACE: DB 20H,20H,20H,20H,20H,00H RET

BAK: DB 08H,08H,08H,08H

INT 3HCODE ENDS END

: set rtc

OUTPUT 2500AD symbols on

;8086 MICROPROCESSOR ;INTERFACE OF REAL TIME CLOCK WITH 8086UP ;REGISTORS:AX,BX,CX,DX,SI,DI, ;PROCEDURE: ;PORT:PORTA,PORTB,PORTC ORG 2300H

DB 09H ; X1 SECONDS ---2300H DB 05H ; X10 SECONDS ---2301H

DB 09H ; X1 MINUTES ---2302H DB 05H ; X10 MINUTES ---2303H

DB 09H ; X1 HOURS ---2304H DB 02H ; X10 HOURS ---2305H

PORTA EQU 0FFE0HPORTB EQU 0FFE2HPORTC EQU 0FFE4HCWR EQU 0FFE6H ;CWR OF 8255

OUTSTRG EQU 0FE00:1B55HOUTBYTE EQU 0FE00:1B64H

ORG 2400H

XCHG AX,AX ; CLEAR AX MOV BL,00H ; BL CONTAINS ADDRESS

69

MOV SI,0000H ; SI CONTAINS CONTENTS OF ADDRESS MOV AL,80H ; PORTA=PORTB=PORTC=OUTPUT MOV DX,0FFE6H ; ADDRESS OF CWR OUT DX,AL

MOV AL,10H ;PC4=HOLD=1 TO MAKE STATIC XS1 FOR 150US MOV DX,0FFE4H OUT DX,AL

MOV AL,28H ;DELAY FOR HOLD SET UP TIME =150USHLDY1: DEC AL JNE HLDY1

SET: MOV AL,BL ; PORTA IS CONNECT TO DO-D4 MOV DX,0FFE2H ; TBL=2300:0000=[XS1] OUT DX,AL ; HRS:MIN:SE

MOV AL,50H ; HOLD=1 AND WRITE=1 MOV DX,0FFE4H OUT DX,AL

MOV AL,10H ; HOLD=1 MOV DX,0FFE4H OUT DX,AL

INC BL ; TO GET NEXT PARAMETER ; XS1,--XS10,XM1,XM10,H1,H10 ; 12 HOURS OR 24 HOURS FORMAT CMP BL,08H ; AM OR PM JZ STOP1

INC SI ; SI INDICATES CONTENT OF ADDRESS JMP SET

STOP1: MOV AL,00H ; HOLD=0 ,READ=0,WRITE=0 MOV DX,0FFE4H OUT DX,AL

INT 3H ; RETURN TO MONITOR

70

13. INTERFACING DAC AND ADC WITH 8086

Aim: To interface ADC and DAC’s with 8086 microprocessor

Examples:

1)

Microcontroller based systems require interfaces that can convert on board digital signal to equivalent analog signals for specific applications. Digital to analog converters are invariably used for this purpose. The range of applications includes waveform generation and pattern generation.

Interface Description: The dual interface consists of two digital analog converters (DAC 0800) the outputs of which are connected to voltages using op amps (MC 1458). The voltage outputs (0 to 10v )of the opamps are terminated in a 4 way connector for external connection. A 10v stable reference voltage for the DAC’s is obtained using the LM 723 regulator. Unipolar or Bipolar outputs are selected by either shorting J1 and J3 to J2 and J4 respectively

;INTERFACING TO 8086 WITH DAC INTERFACE

OUTPUT 2500AD symbols on

;8086 MICROPROCESSOR ;INTERFACING TO 8086 WITH DAC INTERFACE ;WRITE AN ALP FOR DISPLAY 'A' ON CRO ;PROCEDURE:NONE ;PORT:PORTA

CODE SEGMENT ORG 2000H ASSUME CS:CODE

MOV AL,80H ;INTIALIZE 8255PPI MOV DX,0FFE6H ;PORTA,PORTB,PORTC ARE OUTPUT OUT DX,AL ;0FFE6H CONTAINS CWR OF 8255

REPEAT: MOV AL,00HGOB: MOV DX,0FFE0H ;0FFE0H INDICATES PORT A OUT DX,AL INC AL CMP AL,80H JNZ GOB MOV DX,0FFE0H OUT DX,AL GOB1: INC AL MOV DX,0FFE0H OUT DX,AL PUSH AX MOV AL,80H MOV DX,0FFE0H OUT DX,AL POP AX

CMP AL,0FFH

71

JNZ GOB1

MOV DX,0FFE0H OUT DX,ALGOB2: DEC AL MOV DX,0FFE0H OUT DX,AL PUSH AX MOV AL,80H MOV DX,0FFE0H OUT DX,AL POP AX CMP AL,80H JNZ GOB2 MOV DX,0FFE0H OUT DX,ALGOB3: DEC AL MOV DX,0FFE0H OUT DX,AL CMP AL,00H JNZ GOB3

JMP REPEAT INT 3H CODE ENDS END

2) ADC is realized utitilizing digital to analog converter and successive approximation method. The interface consists of an 8 bit D to A converter. The port output is latched and presented as input to the DAC. The DAC output and analog input are fed to a comparator whose output is less then the analog input.This indicates that a larger value of digital input to DAC is required. Thus this line can be monitored to determine the digital equivalent of the analog input voltage. ;ADC USING DAC INTERFACE

OUTPUT 2500AD symbols on

;8086 MICROPROCESSOR ;INTERFACING TO ADC INTERFACE WITH 8086 ;ADC USING DAC INTERFACE ;REGISTER:AX,BX,CX,DX ;PROCEDURE:NONE ;PORT:PORT 1

CODE SEGMENT ORG 4000H ASSUME CS:CODE

START: MOV SP,3000H

72

MOV AL,81H ;PORT A & PORT B ARE OUTPUT MOV DX,0FFE6H ;PORT C LOW ARE INPUT OUT DX,AL ; 0FFE6H INDICATES THE ADDRESS OF CWR ; OF 8255PPI

XOR AX,AX MOV DX,0FFE4H ; WHEN STC BUTTON PRESSED THEN PC1=1 LOOP1: IN AL,DX ( PC AS I/P) TEST AL,02H JE LOOP1 CALL DELAY ; DELAYLOOP2: IN AL,DX TEST AL,02H ; WHEN STC BUTTON RELEASED THEN PC1=0 JNE LOOP2 ; SQUARE PULSE GIVEN TO PC1

MOV AL,0FFHW2: MOV DX,0FFE0H ; COUNTER=00H INC AX ; PA AS O/P IS CONNECTED WITH 8 LED'S OUT DX,AL PUSH AX CALL DELAY MOV DX,0FFE4H ; CHECK WHETHER EOC=00 MEANS PROCESS FINISH IN AL,DX ; PC0 IS CONNECTED TO EOC OF ADC TEST AL,01H JE DONE POP AX ; JMP W2 ; IF EOC=01 THEN INCREMENT COUNTER

DONE: MOV AX,4C00H ; EXIT TO DOS INT 21H

DELAY: MOV CX,0FFFH ; DELAY BETWEEN LOGIC '1' AND '0'LOOP3: LOOP LOOP3 RET

CODE ENDS END

73