You are on page 1of 13

8086 Assembly Language Programs Contents Next Page>>

;1 Write an alp to sort in ascending order using bubble sort algorithm ; a given set of byte sized unsigned numbers in memory.The sorted ; elements should replace the original unsorted elements in memory. name bubblesort page 60,80 title ascending order using bubble sort .model small .stack 64 .data a db 34h,78h,56h,47h si_ze dw $-a ;si_ze=no of elements .code bubsort: mov ax,@data mov ds,ax mov bx,si_ze dec bx ;bx=no of passes needed to complete sorting(n-1) outlup: mov cx,bx ;cx=no of comparisions to be performed in a pass mov si,0 inlup: mov al,a[si] inc si cmp al,a[si] jb go_on xchg al,a[si] mov a[si-1],al go_on: loop inlup ;dec cx,until cx=0 dec bx jnz outlup int 3 ;breakpoint interrupt align 16 end bubsort

;2. Write an 8086 alp to sort in descending order,using selestion sort ; algorithm a given set of 8 bit unsigned numbers in memory.The sorted elements ; should replace the original unsorted elements in memory.Store in a memory ; location the number of comparisions made.

name selectionsort page 60,80 title descending order using selection sort .model small .stack 64 .data a db 44h,11h,22h,66h si_ze dw $-a ;si_ze=4 nc dw ? ;total no of comparisions made .code selsort: mov ax,@data mov ds,ax mov dx,si_ze ;in selsort for n elements to sort we need n-1 passes dec dx ;dx=3 no of passes required mov nc,0 outlup: mov cx,dx ;cx=no of comparisions to be performed in a pass mov si,0 mov ah,a[si] mov bx,si inlup: inc si inc nc cmp ah,a[si] jb go_on mov ah,a[si] ;ah=smallest element in the vector mov bx,si ;bx=position of the smallest element go_on: loop inlup ;untill cx=0 xchg ah,a[si] ;xchg the last element pointed by si,with the mov a[bx],ah ;smallest element pointed by bx dec dx jnz outlup int 3 ;breakpoint interrupt align 16 end selsort

;3. Write an 8086 alp to sort in ascending order using Insertion Sort ; algorithm,a given set of 16 bit unsigned numbers in memory.The sorted ; elements should replace the original unsorted elements in memory. name insertionsort page 60,80 title ascending order using insertion sort algorithm

.model small .stack 64 .data a dw 78h,34h,12h,56h si_ze dw ($-a)/2 ;si_ze=4(no of elements) .code insort: mov ax,@data mov ds,ax mov cx,2 ;cx=2,insert the second element in the proper position outlup: mov dx,cx dec dx ;dx=cx-1,max no of comparisions needed to insert element mov si,dx add si,si mov ax,a[si] inlup: cmp a[si-2],ax jbe inlupexit mov di,a[si-2] mov a[si],di dec si dec si dec dx jnz inlup inlupexit: mov a[si],ax inc cx ;inc cx to insert the next element in proper position cmp cx,si_ze jbe outlup exit: int 3 ;breakpoint interrupt align 16 end insort

;4. Add/Sub of multiword name addsub page 60,80 title 8086 alp for multi word addition/subtraction .model small .stack 64 .data n1 db 12h,34h,56h,78h,9ah,0bch,0deh,0f0h n2 db 0bch,12h,78h,34h,56h,0deh,0f0h,9ah

s db 8 dup(?) d db 8 dup(?) .code addsub: mov ax,@data mov ds,ax mov cx,8 ;cx is used as loop counter mov bx,7 ;bx contains the offset address of byte in n1 & n2 clc addagn: mov al,n1[bx] adc al,n2[bx] mov s[bx],al ;store sum in s[] dec bx loop addagn mov cx,8 mov bx,7 clc subagn: mov al,n1[bx] sbb al,n2[bx] mov d[bx],al ;store difference in d[] dec bx loop subagn int 3 align 16 end addsub

;5. Write an 8086 alp to get the screen width(no of cols) using BIOS ; interrupt,and calculate the no of rows from the appropriate word ; location in BIOS data area,and clear the screen using BIOS interrupt. name clearscreen1 page 60,80 title clear screen using bios interrupt .model small .stack 64 .data bytes dd 0040004ch rows db ? cols db ? msg1 db 0dh,0ah,'Total no of rows(in hex)=','$' msg2 db 0dh,0ah,'Total no of columns(in hex)=','$'

msg3 db 0dh,0ah,'Press any key to clear screen','$' hexcode db '0123456789abcdef' .code display proc push ax push bx push cx push dx lea dx,msg1 ;displays msg1 mov ah,09h int 21h mov al,rows ;al=no of rows[25] mov cl,10h mov ah,00h div cl ;25/10 | al=quotient[2] | ah=remainder[5] mov bl,al ;al=2 mov dl,hexcode[bx] ;dl=8 bit ascii code of char to be displayed[2] push ax mov ah,02h ;display char to std o/p dev int 21h pop ax mov bl,ah ;ah=5 mov dl,hexcode[bx] ;dl=8 bit ascii code of char to be displayed[5] mov ah,02h ;display char to std o/p dev int 21h lea dx,msg2 ;displays msg2 mov ah,09h int 21h mov al,cols ;al=no of cols[80] mov cl,10h mov ah,00h mov bh,00h div cl ;80/10 | al=quotient[8] | ah=remainder[0] mov bl,al ;al=8 mov dl,hexcode[bx] ;dl=8 bit ascii code of char to be displayed[8] push ax mov ah,02h ;display char to std o/p dev int 21h pop ax mov bl,ah ;ah=0 mov dl,hexcode[bx] ;dl=8 bit ascii code of char to be displayed[0] mov ah,02h ;display char to std o/p dev int 21h pop dx pop cx

pop bx pop ax ret display endp

;end display procedure

main: mov ax,@data mov ds,ax mov ah,0fh int 10h mov cols,ah ;ah=no of char cols on screen mov cl,ah mov ch,0 push ds lds si,bytes mov ax,[si] ;ax=total no of bytes on video page(1b ascii+1b AB) pop ds shr ax,1 ;divides ax by 2 to get total no of chars on page div cl mov rows,al call display lea dx,msg3 mov ah,09h ;displays msg3 int 21h mov ah,01h ;i/p char from std i/p dev & echo to std o/p dev int 21h mov dh,0 ;initialize row coordinate to 0 again: mov bh,0 ;bh=page 0 mov dl,0 ;initialize column coordinate to 0 mov ah,02h ;set cursor position to (dl,dh) int 10h mov bl,0 ;colour(set foregnd & bckgnd of char with same colour) mov al,'x' ;char to be displayed mov ah,09h ;write char at cursor position int 10h inc dh ;inc row coordinate by one position cmp dh,rows jb again mov ah,4ch ;exit int 21h end main

;6. GCD of 4 unsigned 16 bit numbers name gcd page 60,80 title program to find gcd of 4 unsigned 16 bits numbers .model small .stack 64 .data values dw 0090,0120,4bh,0019h gcd dw ? .code hcf proc again: cmp ax,bx je exit jb bigbx divaxbx: mov dx,0 div bx cmp dx,0 je exit mov ax,dx jmp again bigbx: xchg ax,bx jmp divaxbx exit: mov gcd,bx ret hcf endp ;Main program gcd4: mov ax,@data mov ds,ax mov ax,values mov bx,values+2 call hcf mov ax,gcd mov bx,values+4 call hcf mov ax,gcd mov bx,values+6 call hcf int 3 align 16

end gcd4

;7. LCM of 2 16 bit unsigned numbers name lcm page 60,80 title program to find lcm of 2 16 bit unsigned numbers .model small .stack 64 .data values dw 0025,0015 lcm dw 2 dup(?) .code l_c_m: mov ax,@data mov ds,ax mov dx,0 mov ax,values ;dx_ax=25 mov bx,values+2 ;bx=15 again: push ax push dx div bx cmp dx,0 ;remainder of the division is stored in dx je exit pop dx pop ax add ax,values jnc noincdx inc dx noincdx: jmp again exit: pop lcm+2 pop lcm int 3 align 16 end l_c_m

;8. ; ; ;

Write an 8086 alp to search for a given 8 bit value using linear search in an array of 8 bit numbers.Message should be displayed on crt indicating whether the search was a failure or a success.If it is a success case,the position of the element in the array is to be displayed

name linearsearch page 60,80 title linear search program .model small .stack 64 .data array db 55h,33h,44h,66h,22h len dw $-array ;length=5 scrkey equ 33h asc1 equ (scrkey/10h)+'0' ;asc1='3' asc2 equ (scrkey mod 10h)+'0' ;asc2='5' sucmsg db 'Element ',asc1,asc2,' found at position:' result db ?,0ch,0ah,'$' failmsg db 'Element ',asc1,asc2,' Not found',0ch,0ah,'$' .code lin: mov ax,@data mov ds,ax mov es,ax cld ;direction flag D=0 mov di,0 ;di=0,autoincrement di mov al,scrkey ;al=35 mov cx,len repne scasb ;scasb==>[al]-[[di]] jz success lea dx,failmsg jmp display success: mov bx,di ;bx=position of the scrkey found in array add bl,'0' ;convert this position into ascii for display purpose mov result,bl lea dx,sucmsg display: mov ah,09h int 21h mov ah,4ch int 21h align 16 end lin ;9. ; ; ; ; Write an 8086 alp to search for a given 16 bit value using binary search in an array of 16 bit numbers,which are in ascending order.Message should be displayed on CRT indicating whether the search was a failure or a success.If it is a success case,the position of the element in the array is to be displayed.

name binarysearch page 60,80 title binary search program to search a 16 bit value .model small .stack 64 .data cr equ 13 lf equ 10 array dw 1122h,2345h,3344h,4455h,5566h len dw ($-array)/2 ;length=5 scrkey equ 2345h asc1 equ (scrkey/1000h)+'0' ;asc1='2' asc2 equ (scrkey/100h) mod 10h + '0' ;asc2='3' asc3 equ (scrkey/10h) mod 10h " '0' ;asc3='4' asc4 equ (scrkey mod 10h) + '0' ;asc4='5' sucmsg db 'Given Element ' db ' Found at position:' result db ?,cr,lf,'$' failmsg db 'Given Element ' db ' Not found',cr,lf,'$' .code binscr: mov ax,@data mov ds,ax mov bx,1 mov dx,len ;dx=5 mov cx,scrkey ;cx=2345 again: cmp bx,dx ja failure mov ax,bx add ax,dx shr ax,1 mov si,ax dec si add si,si cmp cx,array[si] jae biger dec ax mov dx,ax jmp again biger: je success inc ax mov bx,ax

jmp again success: add al,'0' mov result,al lea dx,sucmsg jmp display failure: lea dx,failmsg display: mov ah,09h int 21h quit: mov ah,4ch int 21h align 16 end binscr

;10. Using BIOS routine,write an 8086 alp to find memory size of the PC you ; are using.Using appropriate message,the display should indicate memory ; size in Kilo bytes using 4 hex digits.Also check the result with the ; appropriate word in BIOS data area using debug/codeview. name memorysize page 60,80 title program to find memory size using int 12h .model small .stack 64 .data msg db 'Memory size in Kilo bytes=' ascres db 4 dup(?),'Hex',0ch,0ah,'$' res dw ? hexcode db '0123456789abcdef' .code hex_asc proc mov dl,10h mov ah,0 mov bx,0 div dl mov bl,al mov dh,hexcode[bx] mov bl,ah mov dl,hexcode[bx] ret hex_asc endp main:

mov ax,@data mov ds,ax int 12h mov res,ax mov al,byte ptr res call hex_asc mov ascres+2,dh mov ascres+3,dl mov al,byte ptr res+1 call hex_asc mov ascres,dh mov ascres+1,dl mov dx,offset msg mov ah,09h int 21h mov ah,4ch int 21h align 16 end main

Contents

Next Page>>

All the above Programs were executed on Microsoft's Macro Assembler Version 5.0 Copyrights Madhu Sudan Rao G.K [CodeEverywhere.Com]

This Page is an antiquarian - possibly outdated - usergenerated website brought to you by an archive. It was mirrored from Geocities in the end of october 2009. For any questions about this page contact the respective author. To report any mal content send URL to oocities[at]gmail[dot]com. For any questions concerning the archive visit our main page:OoCities.org. The drought in East Africa put millions of people in danger to die of hunger. If we donate, then we can help saving lives.

You might also like