home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / pcmag / vol7n17.zip / PP717.ZIP / TRYSTR3.ASM < prev    next >
Assembly Source File  |  1988-08-30  |  6KB  |  162 lines

  1. ;----------------------------------------------------------------------
  2. ; TRYSTR3.ASM --- MASM String Package #3 Demo
  3. ; Copyright (c) 1988 Ziff Communications Co.
  4. ; PC Magazine * Ray Duncan * 12-13-88
  5. ;----------------------------------------------------------------------
  6. cr      equ     0dh             ; ASCII carriage return
  7. lf      equ     0ah             ; ASCII line feed
  8.  
  9. stdin   equ     0               ; standard input handle
  10. stdout  equ     1               ; standard output handle
  11. stderr  equ     2               ; standard error handle
  12.  
  13. DGROUP  group   _DATA
  14.  
  15. _DATA   segment word public 'DATA'
  16.  
  17. str1    db      80 dup (0)      ; string 1 buffer
  18. str2    db      80 dup (0)      ; string 2 buffer
  19.  
  20. s1len   dw      ?               ; string 1 length
  21. s2len   dw      ?               ; string 2 length
  22.  
  23. msg1    db      cr,lf,lf,"Enter string 1:  "
  24. msg1_len equ $-msg1
  25.  
  26. msg2    db      cr,lf,"Enter string 2:  "
  27. msg2_len equ $-msg2
  28.  
  29. msg3    db      cr,lf,"String 1 at: "
  30. msg3a   db      "????H",cr,lf,"String 2 at: "
  31. msg3b   db      "????H",cr,lf,lf,"STRCMPI: Z="
  32. msg3c   db      "? S="
  33. msg3d   db      "?",cr,lf,"STRNDXI: CY="
  34. msg3e   db      "? DI="
  35. msg3f   db      "????H"
  36. msg3_len equ $-msg3
  37.  
  38. _DATA   ends
  39.  
  40. _TEXT   segment word public 'CODE'
  41.         extrn   strcmpi:near
  42.         extrn   strndxi:near
  43.         extrn   itoh:near
  44.         assume  cs:_TEXT,ds:DGROUP
  45.  
  46. main    proc    near
  47.                                 
  48.         mov     ax,_DATA        ; make our data segment
  49.         mov     ds,ax           ; addressable...
  50.         mov     es,ax
  51.  
  52.         mov     ax,offset str1  ; format string 1
  53.         mov     bx,offset msg3a ; buffer address
  54.         call    itoh            ; for output
  55.  
  56.         mov     ax,offset str2  ; format string 2
  57.         mov     bx,offset msg3b ; buffer address
  58.         call    itoh            ; for output
  59. main1:                          ; display prompt for string 1...
  60.         mov     dx,offset DGROUP:msg1 ; address of message
  61.         mov     cx,msg1_len     ; length of message
  62.         mov     bx,stdout       ; standard output handle
  63.         mov     ah,40h          ; function 40h = write
  64.         int     21h             ; transfer to MS-DOS
  65.                                 ; get first string...
  66.         mov     dx,offset DGROUP:str1 ; address of buffer
  67.         mov     cx,64           ; maximum entry length
  68.         mov     bx,stdin        ; standard input handle
  69.         mov     ah,3fh          ; function 3fh = read
  70.         int     21h             ; transfer to MS-DOS
  71.  
  72.         sub     ax,2            ; anything entered?
  73.         mov     s1len,ax        ; save string length
  74.         
  75.         jnz     main2           ; jump if something entered
  76.  
  77.         mov     ax,4c00h        ; exit if empty line
  78.         int     21h             ; transfer to MS-DOS
  79. main2:                          ; display prompt for string 2...
  80.         mov     dx,offset DGROUP:msg2 ; address of message
  81.         mov     cx,msg2_len     ; length of message
  82.         mov     bx,stdout       ; standard output handle
  83.         mov     ah,40h          ; function 40h = write
  84.         int     21h             ; transfer to MS-DOS
  85.                                 ; get second string...
  86.         mov     dx,offset DGROUP:str2 ; address of buffer
  87.         mov     cx,64           ; maximum entry length
  88.         mov     bx,stdin        ; standard input handle
  89.         mov     ah,3fh          ; function 3fh = read
  90.         int     21h             ; transfer to MS-DOS
  91.  
  92.         sub     ax,2            ; save string length
  93.         mov     s2len,ax
  94.  
  95.         mov     si,offset str1  ; compare the strings
  96.         mov     bx,s1len
  97.         mov     di,offset str2
  98.         mov     dx,s2len
  99.         call    strcmpi
  100.  
  101.         call    zflag           ; format Z and S
  102.         mov     msg3c,al        ; flags for output
  103.         call    sflag
  104.         mov     msg3d,al
  105.  
  106.         mov     si,offset str1  ; search string 2
  107.         mov     bx,s1len        ; for string 1
  108.         mov     di,offset str2
  109.         mov     dx,s2len
  110.         call    strndxi
  111.  
  112.         call    cflag           ; format CY flag
  113.         mov     msg3e,al        ; for output
  114.  
  115.         mov     ax,di           ; format string 2
  116.         mov     bx,offset msg3f ; pointer for output
  117.         call    itoh
  118.                                 ; display results...
  119.         mov     dx,offset DGROUP:msg3   ; address of message
  120.         mov     cx,msg3_len     ; length of message
  121.         mov     bx,stdout       ; standard output handle
  122.         mov     ah,40h          ; function 40h = write
  123.         int     21h             ; transfer to MS-DOS
  124.  
  125.         jmp     main1           ; get more strings
  126.  
  127. main    endp
  128. ;----------------------------------------------------------------------
  129. zflag   proc    near            ; check state of Zero flag
  130.                                 ; return AL = 'F' or 'T'
  131.         mov     al,"F"
  132.         jnz     zflag1
  133.         mov     al,"T"
  134. zflag1: ret     
  135.  
  136. zflag   endp
  137. ;----------------------------------------------------------------------
  138. sflag   proc    near            ; check state of Sign flag
  139.                                 ; return AL = 'F' or 'T'
  140.         mov     al,"F"
  141.         jns     sflag1
  142.         mov     al,"T"
  143. sflag1: ret     
  144.  
  145. sflag   endp
  146. ;----------------------------------------------------------------------
  147. cflag   proc    near            ; check state of Carry flag
  148.                                 ; return AL = 'F' or 'T'
  149.         mov     al,"F"
  150.         jnc     cflag1
  151.         mov     al,"T"
  152. cflag1: ret     
  153.  
  154. cflag   endp
  155.         
  156. _TEXT   ends
  157.  
  158. STACK   segment para stack 'STACK'
  159.         db      128 dup (?)
  160. STACK   ends
  161.         end     main
  162.