Friday 25 January 2013

8086 microprocessor Programming (Part 5)

PROGRAMMING (CONTINUED)


Aims of the Experiment:

  • To develop further understanding of arithmetic instructions.
  • Give a brief introduction to subroutine handling instructions. 
  • Give introduction to some simple DOS functions using ‘int 21h’. 


Important Notes:

  • DOS Function Requests:

The DOS operating system uses interrupt type 21h to make many functions available to the user. Most of these functions provide for input and/or output to devices. Many are for various operations with disk files. See Appendix C of [1] for details of these functions. In this experiment, we’ll discuss how to use DOS functions and describe some of the simpler ones. 
All functions called with ‘int 21h’ invoke the same interrupt handler. The desired function is selected by placing its function number in the AH register half. Many functions either require additional data to be sent to the interrupt handler procedure and/or they return information. Such parameters are normally passed using registers. The only registers altered by this interrupt handler are those used to return information to the user. The following table summarizes some of the functions covered in this experiment. 

Function Action Parameter (s) 
for DOS Parameter(s) DOS Returned by 
Number
1h Input character 
(with echo)   None Character in AL
2h Display character Character in
 DL None
8h Input character
 (no echo) None Character in Al
4Ch Terminate 
process Return code 
in AL None

 Each complete program in previous experiment used DOS function 4Ch to terminate program execution. (Remember we put 4C00h in AX before ‘int 21 h’ instruction.) We’ll use other functions in this experiment for input and output of characters from/to the console. 

  • You have been using DEBUG program. While using this program, it should be kept in mind that it works in default with hex numbers. The MASM/TASM program, on the other hand, works in default with decimal numbers. So, in order to work with hex numbers while using MASM/TASM , always put an ‘h’ followed by the number. For example ‘1234’ will be treated as decimal 1234, whereas ‘1234h’ will be treated as hex 1234. 

  • Whenever the first digit in a hex number is an alphabet (a-h), do not forget to put a ‘0’ before this number, otherwise an error will occur. As an example, instead of writing ‘F000h’ always write ‘0F000h’. 

  • Write the following program in a text editor. 

Page, 132
Title #. None # 
Dosseg 
.model samall 
.stack 100h 
.data ; variables here
.code 
order _word proc 
mov ax, @data ; initialize the DS register 
mov ds, ax 
mov si, 1000h
mov cx, 08h ; initialize the counter reg. 
mov ah,01h ; DOS function for input character with echo  
       next_word: ; this a label 
int 21h ; interrupt for DOS services 
mov [si] , al ; save the input byte 
inc si ; the next byte 
dec cx ; decrement counter 
               jnz next-word ; go back if count if count not zero 
               mov cx, 08h ; DOS function for display char 
              mov   ah, 02h
Previous_word:
dec si 
mov d1, [si] ; get char to be displayed in DL 
int 21h ; interrupt for DOS services 
dec cx 
jnz previous_word

mov ax, 4C00h ; end program 
int 21 h 
order_word endp 
end order_word 

Save assemble, and link this program and run it first at the DOS prompt. The program will wait for you to type eight characters on the keyboard. Answer the following questions: 

  1. What is this program doing?
  2. Why have we used the instruction ‘dec si’ before ‘int 21h’? What will happen if we place it after the ‘int 21h’ instruction? 
  3. Make a modification in this program so that it displays only the first, third, fifth, and seventh input characters in that order. Verify our program. 


  • The following program uses the Binary to Reflected Gray Code conversion subroutine of the last experiment to convert a string of binary numbers to a corresponding string of Gray Code numbers. Write the following assembly language program using a text editor: 

Page, 132
Title program for converting Binary String to Gray Code String 

Dosseg 
.model small 
.stack 100h 
        .data ; variables here 
values db 0h, 1h, 3h,2h, 6h, 7h, 5h, 4h, 0ch, 0dh, 0fh, 0eh, 0ah, 0bh, 9h, 8h.
.code
order_word proc
mov ax, @data ; initialize the DS register 
mov ds, ax 
mov si, 01000h
mov dx, 08h initialize the counter reg. 
mov ah, 01h ; DOS function for input  character, with echo 
next_word: this a label 
int 21 h ;nterrupt for DOS services 
mov cl, al ;opy AL in CL 
and cl, 0fh ;make the upper nibble ‘0’ 
;ince AL contains ASCII code 
and al, 0f0h ;save the upper nibble 
call code_conv 
or cl, al ;convert back to ASCII 
mov [si], cl ; save the input byte 
inc si ; the next byte 
dec dx ; decrement counter 
jnz next_word ; go back if cont not zero 
mov si , 1000h ; re-initialize SI 
mov cx, 08h 
mov ah, 02h ; DOS function for display char 
previous_word: 
mov d1, [si] ; get char to be displayed in DL 
int 21 h ; interrupt for DOS services 
inc si 
dec cx 
jnz previous_word 

mov ax, 4C00h ; end program 
int 21h 
order_word endp ; main procedure ends here 
code_conv proc ; Code conversion subroutine   
push ax ; save AX as it will be 
; used in this subroutine
mov bx, offset values ; offset directive to load 
; the offset ad. Of values in BX 
mov al, cl 
xlat ; replace AL by contents 
; of DS: BX + AL 
mov cl, al
pop ax ; Get back the orig. value of AX 
ret
code_conv endp 
end order_word 

Save the program, assemble and link it, and finally run it form the DOS prompt. Load in DEBUG and trace the program to understand the meanings of each instruction. 

Answer the following questions: 
  1. What will happen if you do not use the ‘AND’ and ‘OR’ instructions in the above program?   
  2. Using DEBUG, find out what are the contents of SS: SP before and after the execution of the ‘PUSH AX’ instruction. 


  • Convert the negative numbers in the following list in to 2’s complement form and replace ni (i=1 to 8) in the data segment of the following program by these numbers. Write this program, assemble, and link it. Find out the purpose of this program. Put comments where you feel necessary. To get more insight, trace with DEBUG. List of numbers: 0228h, -225Ah, 0524h, 25Afh, -023Bh, -1133h, 2FFABh, 1230h. 


Page, 132
Title program for Adding 8 data words 

Dosseg 
.model small 
.stack 100h
.data ; variables here 
value dw nl, n2,n3,n4, n5, n6, n7, n8
.code 
add_word proc 
mov ax, @data ; initialize the DS register 
mov ds, ax
mov si, 0h ; initialize source index 
mov ax, 0h ; initialize the sum register 
mov cx, 08h ; initialize the counter reg. 
mov dl, 0h 
next_word: 
add ax, [si+ offset value] 
jnc no_increment 
inc dl 
no_increment: 
inc si 
inc si 
dec cx 
jnz next_word 

mov [si+ offset value] , ax 
inc si 
inc si 
mov [si+ offset value] , dl 
mov ax, 4C00h ; end program 
int 21h 
add_word endp 
end add_word 

  • Write, assemble, and debug an assembly language program that asks the user to enter 8 decimal numbers (0-9), and then it finds the mean of these numbers and displays the result on screen. 
  • Try to modify the program such that it calculates the mean square value and then displays all the digits of the result on screen? 



REFERENCES: 

  1. Kip R. Irvine, Assembly Language for the IBM-PC. Macmillan Publishing Company, 1990. 
  2. Avtar Sing and Walter A. Trieble, The 8086 and 80286 Microprocessors, Hardware, Software, and Interfacing. Prentice-Hall Inc. 1990 
  3. Richard C Detmer, Fundamentals of Assembly Language Programming, Using IBM PC and Compatibles. DC Heath and Company. 1990.


No comments:

Post a Comment