home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 December
/
simtel1292_SIMTEL_1292_Walnut_Creek.iso
/
msdos
/
pcmag
/
vol7n16.arc
/
TRYQSI.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-09-27
|
7KB
|
203 lines
name tryqsi
title TRYQSI Demo of Integer Quicksort
page 55,132
;
; TRYQSI.ASM Demonstration of Integer Quicksort
;
; Copyright 1988, Ziff Communications Co.
; PC Magazine * Ray Duncan
;
stdin equ 0 ; standard input handle
stdout equ 1 ; standard output handle
stderr equ 2 ; standard error handle
cr equ 0dh ; ASCII carriage return
lf equ 0ah ; ASCII line feed
_TEXT segment word public 'CODE'
assume cs:_TEXT,ds:_DATA
extrn itoa:near
extrn atoi:near
extrn qsorti:near
main proc near
mov ax,_DATA ; make our data segment
mov ds,ax ; addressable...
mov es,ax
main1: ; begin entry of data
mov word ptr ix1,0 ; initialize array index
; display "Enter Numbers"
mov dx,offset msg1 ; DS:DX = message address
mov cx,msg1_len ; CX = message length
mov bx,stdout ; BX = handle
mov ah,40h ; Fxn 40H = write
int 21h ; transfer to MS-DOS
main2: ; convert item number
; to ASCII string...
mov ax,ix1 ; 1-based item number
inc ax
mov bx,offset msg3a ; address for string
call b2dec ; convert it
; display item number
mov dx,offset msg3 ; DS:DX = message address
mov cx,msg3_len ; CX = length
mov bx,stdout ; BX = handle
mov ah,40h ; Fxn 40H = write
int 21h ; transfer to MS-DOS
; read keyboard entry
mov dx,offset ibuff ; DS:DX = input buffer
mov cx,80 ; CX = max input length
mov bx,stdin ; BX = handle
mov ah,3fh ; Fxn 3FH = read
int 21h ; transfer to MS-DOS
cmp ax,2 ; was anything entered?
je main3 ; empty line, exit
mov si,offset ibuff ; convert input to
call atoi ; binary in reg. AX
mov bx,ix1 ; put data into array
shl bx,1 ; (item number * 2)
mov [bx+items],ax
inc word ptr ix1 ; count items stored
cmp word ptr ix1,25 ; force maximum = 25
jne main2 ; get another entry
main3: ; empty line entered...
cmp word ptr ix1,0 ; any data in array?
je main5 ; no, just exit
; otherwise sort data...
mov si,offset items ; DS:SI = first item
mov di,ix1 ; DS:DI = last item
dec di
shl di,1
add di,si
call qsorti ; call QuickSort
; display sorted data...
mov word ptr ix2,0 ; initialize array index
; display "Here are the
; sorted numbers..."
mov dx,offset msg2 ; DS:DX = message address
mov cx,msg2_len ; CX = message length
mov bx,stdout ; BX = handle
mov ah,40h ; Fxn 40H = write
int 21h ; transfer to MS-DOS
main4: ; display next item...
; convert item number
; to ASCII string
mov ax,ix2 ; 1-based item number
inc ax
mov bx,offset msg3a ; address for string
call b2dec ; convert it
; display item number
mov dx,offset msg3 ; DS:DX = message address
mov cx,msg3_len ; CX = message length
mov bx,stdout ; BX = handle
mov ah,40h ; Fxn 40H = write
int 21h ; transfer to MS-DOS
mov bx,ix2 ; calc. array offset
shl bx,1
mov ax,[bx+items] ; get data from array
; convert data to ASCII
mov cx,10 ; use base 10
mov si,offset obuff ; address for string
call itoa ; convert it
; display converted data...
mov cx,ax ; CX = string length
mov dx,si ; DS:DX = string address
mov bx,stdout ; BX = handle
mov ah,40h ; Fxn 40H = write
int 21h ; transfer to MS-DOS
inc word ptr ix2 ; advance through array
mov ax,ix2 ; done with array yet?
cmp ax,ix1
jne main4 ; no, display another
jmp main1 ; restart user entry
main5: mov ax,4c00h ; final exit to MS-DOS
int 21h
main endp
b2dec proc near ; convert binary value 0-99
; to decimal ASCII chars.
; call with
; AL = binary data
; BX = addr. for 2 chars.
aam ; divide AL by 10, leaving
; AH=quotient, AL=remainder
add ax,'00' ; convert to ASCII
mov [bx],ah ; store ten's digit
mov [bx+1],al ; store one's digit
ret ; return to caller
b2dec endp
_TEXT ends
_DATA segment word public 'DATA'
msg1 db cr,lf,lf
db 'Enter numbers to sort...'
db cr,lf
msg1_len equ $-msg1
msg2 db cr,lf
db 'Here are the sorted numbers...'
db cr,lf
msg2_len equ $-msg2
msg3 db cr,lf,'Item '
msg3a db 'xx: '
msg3_len equ $-msg3
ibuff db 80 dup (?) ; keyboard input buffer
obuff db 80 dup (?) ; output conversion buffer
items dw 25 dup (0) ; holds numbers to sort
ix1 dw 0 ; number of array items
ix2 dw 0 ; array output pointer
_DATA ends
STACK segment para stack 'STACK'
db 128 dup (?)
STACK ends
end main