home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / pcmag / vol7n19.arc / PP719.ARC / TRYSTR.ASM < prev    next >
Assembly Source File  |  1988-07-26  |  7KB  |  222 lines

  1. ;----------------------------------------------------------------------
  2. ; TRYSTR.ASM --- demo of MASM string package
  3. ; PC Magazine * Ray Duncan * November 15, 1988
  4. ;----------------------------------------------------------------------
  5. cr      equ     0dh             ; ASCII carriage return
  6. lf      equ     0ah             ; ASCII line feed
  7.  
  8. stdin   equ     0               ; standard input handle
  9. stdout  equ     1               ; standard output handle
  10. stderr  equ     2               ; standard error handle
  11.  
  12. DGROUP  group   _DATA
  13.  
  14. _DATA   segment word public 'DATA'
  15.  
  16. str1    db      80 dup (0)      ; string 1 buffer
  17. str2    db      80 dup (0)      ; string 2 buffer
  18.  
  19. s1len   dw      ?               ; string 1 length
  20. s2len   dw      ?               ; string 2 length
  21.  
  22. msg1    db      cr,lf,lf        
  23.         db      'Enter string 1:  '
  24. msg1_len equ $-msg1
  25.  
  26. msg2    db      cr,lf
  27.         db      'Enter string 2:  '
  28. msg2_len equ $-msg2
  29.  
  30. msg3    db      cr,lf
  31.         db      'String 1 at: '
  32. msg3a   db      '????H'
  33.         db      cr,lf
  34.         db      'String 2 at: '
  35. msg3b   db      '????H'
  36.         db      cr,lf,lf
  37.         db      'STRCMP: Z='
  38. msg3c   db      '? S='
  39. msg3d   db      '?'
  40.         db      cr,lf
  41.         db      'STRNDX: CY='
  42. msg3e   db      '? DI='
  43. msg3f   db      '????H'
  44.         db      cr,lf
  45.         db      'STRSPN: CY='
  46. msg3g   db      '? SI='
  47. msg3h   db      '????H'
  48.         db      cr,lf
  49.         db      'STRBRK: CY='
  50. msg3i   db      '? SI='
  51. msg3j   db      '????H'
  52. msg3_len equ $-msg3
  53.  
  54. _DATA   ends
  55.  
  56.  
  57. _TEXT   segment word public 'CODE'
  58.  
  59.         extrn   strcmp:near
  60.         extrn   strndx:near
  61.         extrn   strspn:near
  62.         extrn   strbrk:near
  63.         extrn   itoh:near
  64.  
  65.         assume  cs:_TEXT,ds:DGROUP
  66.  
  67. main    proc    near
  68.                                 
  69.         mov     ax,_DATA        ; make our data segment
  70.         mov     ds,ax           ; addressable...
  71.         mov     es,ax
  72.  
  73.         mov     ax,offset str1  ; format string 1
  74.         mov     bx,offset msg3a ; buffer address
  75.         call    itoh            ; for output
  76.  
  77.         mov     ax,offset str2  ; format string 2
  78.         mov     bx,offset msg3b ; buffer address
  79.         call    itoh            ; for output
  80.  
  81. main1:                          ; display prompt for string 1...
  82.         mov     dx,offset DGROUP:msg1 ; address of message
  83.         mov     cx,msg1_len     ; length of message
  84.         mov     bx,stdout       ; standard output handle
  85.         mov     ah,40h          ; function 40h = write
  86.         int     21h             ; transfer to MS-DOS
  87.  
  88.                                 ; get first string...
  89.                                 ; address of buffer
  90.         mov     dx,offset DGROUP:str1
  91.         mov     cx,64           ; maximum entry length
  92.         mov     bx,stdin        ; standard input handle
  93.         mov     ah,3fh          ; function 3fh = read
  94.         int     21h             ; transfer to MS-DOS
  95.  
  96.         sub     ax,2            ; anything entered?
  97.         mov     s1len,ax        ; save string length
  98.         
  99.         jnz     main2           ; jump if something entered
  100.  
  101.         mov     ax,4c00h        ; exit if empty line
  102.         int     21h             ; transfer to MS-DOS
  103.  
  104. main2:                          ; display prompt for string 2...
  105.         mov     dx,offset DGROUP:msg2  ; address of message
  106.         mov     cx,msg2_len     ; length of message
  107.         mov     bx,stdout       ; standard output handle
  108.         mov     ah,40h          ; function 40h = write
  109.         int     21h             ; transfer to MS-DOS
  110.  
  111.                                 ; get second string...
  112.         mov     dx,offset DGROUP:str2   ; address of buffer
  113.         mov     cx,64           ; maximum entry length
  114.         mov     bx,stdin        ; standard input handle
  115.         mov     ah,3fh          ; function 3fh = read
  116.         int     21h             ; transfer to MS-DOS
  117.  
  118.         sub     ax,2            ; save string length
  119.         mov     s2len,ax
  120.  
  121.         mov     si,offset str1  ; compare the strings
  122.         mov     bx,s1len
  123.         mov     di,offset str2
  124.         mov     dx,s2len
  125.         call    strcmp          
  126.  
  127.         call    zflag           ; format Z and S
  128.         mov     msg3c,al        ; flags for output
  129.         call    sflag
  130.         mov     msg3d,al
  131.  
  132.         mov     si,offset str1  ; search string 2
  133.         mov     bx,s1len        ; for string 1
  134.         mov     di,offset str2
  135.         mov     dx,s2len
  136.         call    strndx
  137.  
  138.         call    cflag           ; format CY flag
  139.         mov     msg3e,al        ; for output
  140.  
  141.         mov     ax,di           ; format string 2
  142.         mov     bx,offset msg3f ; pointer for output
  143.         call    itoh
  144.  
  145.         mov     si,offset str1  ; validate string 1
  146.         mov     bx,s1len        ; using string 2
  147.         mov     di,offset str2
  148.         mov     dx,s2len
  149.         call    strspn
  150.  
  151.         call    cflag           ; format CY flag
  152.         mov     msg3g,al        ; for output
  153.  
  154.         mov     ax,si           ; format string 1 
  155.         mov     bx,offset msg3h ; pointer for output
  156.         call    itoh
  157.  
  158.         mov     si,offset str1  ; find first char
  159.         mov     bx,s1len        ; in string 1 that
  160.         mov     di,offset str2  ; is in string 2
  161.         mov     dx,s2len
  162.         call    strbrk
  163.  
  164.         call    cflag           ; format CY flag
  165.         mov     msg3i,al        ; for output
  166.  
  167.         mov     ax,si           ; format string 1
  168.         mov     bx,offset msg3j ; pointer for output
  169.         call    itoh
  170.  
  171.                                 ; display results...
  172.         mov     dx,offset DGROUP:msg3   ; address of message
  173.         mov     cx,msg3_len     ; length of message
  174.         mov     bx,stdout       ; standard output handle
  175.         mov     ah,40h          ; function 40h = write
  176.         int     21h             ; transfer to MS-DOS
  177.  
  178.         jmp     main1           ; get more strings
  179.  
  180. main    endp
  181.  
  182.  
  183. zflag   proc    near
  184.  
  185.         mov     al,'F'
  186.         jnz     zflag1
  187.         mov     al,'T'
  188. zflag1: ret     
  189.  
  190. zflag   endp
  191.  
  192.  
  193. sflag   proc    near
  194.  
  195.         mov     al,'F'
  196.         jns     sflag1
  197.         mov     al,'T'
  198. sflag1: ret     
  199.  
  200. sflag   endp
  201.  
  202.         
  203. cflag   proc    near
  204.  
  205.         mov     al,'F'
  206.         jnc     cflag1
  207.         mov     al,'T'
  208. cflag1: ret     
  209.  
  210. cflag   endp
  211.         
  212. _TEXT   ends
  213.  
  214.  
  215. STACK   segment para stack 'STACK'
  216.         
  217.         db      128 dup (?)
  218.  
  219. STACK   ends
  220.  
  221.         end     main
  222.