Vous êtes sur la page 1sur 13

ADIGRAT UNIVERSITY

COLLEGE OF ENGINEERING AND TECHNOLOGY


DEPARTMENT OF ELECTRICAL AND COMPUTER
ENGINEERING
COURSE TITLE MICROCOMPUTER AND INTERFACING

COURSE CODE

PROJECT 1

SECTION ONE

NETWORK FIVE

NO GROUP MEMBERS ID NO
1 MEKONEN HAILE RET/01839/08
2 TESFAYE TEKLU RET/05415/08
3 HELEN HAILE RET/01516/08
4 URGESSA FEYISSA RET/02437/08
5 NATNAEL AMBAW RET /0 /08

SUBMITTED TO INST. MEHARI.G (ASS.PROF)


SUBMISSION DATE 23/05/2011 E.C

1
Question Number One

Algorithm
1. Initialize two arrays that have the same size.
2. Declare another array where the results should be stored.
3. Initialize the counter cx.
4. Get the array element pointed by array pointer.
5. Add array elements and store the results in the third result array.
6. Increment array pointer and decrement counter.
7. Repeat the above three steps until counter equals to zero.
8. Then the program ENDS.

Program
DATA SEGMENT

NUM1 DB 27H,62H,57H,33H

NUM2 DB 34H,21H,32H,55H

RESULT DB 5 DUP(0)

ENDS

CODE SEGMENT

ASSUME DS:DATA CS:CODE

START:

MOV AX,DATA

MOV DS,AX

LEA SI,NUM1

LEA DI,NUM2

2
LEA BX,RESULT

MOV CX,5

LOOP1:MOV AL,[SI]

ADD AL,[DI]

MOV [BX],AL

INC BX

INC SI

INC DI

LOOP LOOP1

MOV AH,4CH

INT 21H

ENDS

END START

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

Question Number Two

Algorithm
1. Display a message.
2. Read an input from user.
3. Check the value entered if it is between the ranges.
4. If the number entered is not in the range, then the second message will be
displayed and another number will be taken from user.
5. Initialize counter.
6. Multiply the value in Ax with the value in Bx.

3
7. The value of the counter will decrease and the multiplied values will be
stored in Ax.
8. Convert the hex value in to decimal and then in to ASCI code.
9. Display the resulting number in ASCI code.
10.End the program.

Program
name "fact"

putc macro char

push ax

mov al, char

mov ah, 0eh

int 10h

pop ax

endm

org 100h

jmp start

result dw ?

start:

mov dx, offset msg1

mov ah, 9

int 21h

jmp n1

msg1 db 0Dh,0Ah, 'enter a number between 0 and 8: $'

n1:

call scan_num

mov ax, 1

4
cmp cx, 0

je print_result

mov bx, cx

mov ax, 1

mov bx, 1

calc_it:

mul bx

cmp dx, 0

jne overflow

inc bx

loop calc_it

mov result, ax

print_result:

mov dx, offset msg2

mov ah, 9

int 21h

jmp n2

msg2 db 0Dh,0Ah, 'The result of the factorial will be: $'

n2:

mov ax, result

call print_num_uns

jmp exit

overflow:

mov dx, offset msg3

mov ah, 9

int 21h

5
jmp n3

msg3 db 0Dh,0Ah, 'the nunber you entered is too big!', 0Dh,0Ah, 'use values from 0 to 8.$'

n3:

jmp start

exit:

mov ah, 0

int 16h

ret

SCAN_NUM PROC NEAR

PUSH DX

PUSH AX

PUSH SI

MOV CX, 0

MOV CS:make_minus, 0

next_digit:

MOV AH, 00h

INT 16h

MOV AH, 0Eh

INT 10h

CMP AL, '-'

JE set_minus

CMP AL, 0Dh

JNE not_cr

JMP stop_input

not_cr:

6
CMP AL, 8

JNE backspace_checked

MOV DX, 0

MOV AX, CX

DIV CS:ten

MOV CX, AX

PUTC ' '

PUTC 8

JMP next_digit

backspace_checked:

CMP AL, '0'

JAE ok_AE_0

JMP remove_not_digit

ok_AE_0:

CMP AL, '9'

JBE ok_digit

remove_not_digit:

PUTC 8

PUTC ' '

PUTC 8

JMP next_digit

ok_digit:

PUSH AX

MOV AX, CX

MUL CS:ten

MOV CX, AX

7
POP AX

CMP DX, 0

JNE too_big

SUB AL, 30h

MOV AH, 0

MOV DX, CX

ADD CX, AX

JC too_big2

JMP next_digit

set_minus:

MOV CS:make_minus, 1

JMP next_digit

too_big2:

MOV CX, DX

MOV DX, 0

too_big:

MOV AX, CX

DIV CS:ten

MOV CX, AX

PUTC 8

PUTC ' '

PUTC 8

JMP next_digit

stop_input:

CMP CS:make_minus, 0

JE not_minus

8
NEG CX

not_minus:

POP SI

POP AX

POP DX

RET

make_minus DB ?

SCAN_NUM ENDP

PRINT_NUM PROC NEAR

PUSH DX

PUSH AX

CMP AX, 0

JNZ not_zero

PUTC '0'

JMP printed

not_zero:

CMP AX, 0

JNS positive

NEG AX

PUTC '-'

positive:

CALL PRINT_NUM_UNS

printed:

POP AX

POP DX

RET

9
PRINT_NUM ENDP

PRINT_NUM_UNS PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV CX, 1

MOV BX, 10000

CMP AX, 0

JZ print_zero

begin_print:

CMP BX,0

JZ end_print

CMP CX, 0

JE calc

CMP AX, BX

JB skip

calc:

MOV CX, 0

MOV DX, 0

DIV BX

ADD AL, 30h

PUTC AL

MOV AX, DX

skip:

PUSH AX

10
MOV DX, 0

MOV AX, BX

DIV CS:ten

MOV BX, AX

POP AX

JMP begin_print

print_zero:

PUTC '0'

end_print:

POP DX

POP CX

POP BX

POP AX

RET

PRINT_NUM_UNS ENDP

ten DW 10

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

Question Number Three

Algorithm
1. Initialize the two registers, AX &CX.
2. Display 0034 & 0067 to the given port number.
3. Initialize the counter.
4. The counter will decrement and the values of AX will be display to port
number 199.
5. Repeat step 4 until port number 199 displays zero.

11
6. The program will end.

Program
#start=led_display.exe#

#make_bin#

NAME "NETWORK2"

MOV AX,67

MOV BX,AX

MOV AX,34

OUT 199,AX

MOV AX,BX

OUT 199,AX

MOV CX,68

MOV AX,CX

DEC AX

12
NETWORK2:

OUT 199,AX

DEC AX

LOOP NETWORK2

ENDS

Programs of Q#1 and Q#3 are written by the group members they are
not copied from anything.

But the program of Question number two is copied from the example in
the emulator.

13

Vous aimerez peut-être aussi