home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / asmutil / stdlib.zip / STRCMP.ASM < prev    next >
Assembly Source File  |  1990-10-18  |  2KB  |  98 lines

  1. stdlib        segment    para public 'slcode'
  2.         assume    cs:stdlib
  3. ;
  4. ;
  5. ; strcmp- Compares two strings.
  6. ;
  7. ; inputs:
  8. ;
  9. ;    es:di-    First string (The string to compare)
  10. ;    dx:si-    Second string (The string to compare against)
  11. ;
  12. ;    e.g.,
  13. ;        "if (es:di < dx:si) then ..."
  14. ;
  15. ; returns: 
  16. ;
  17. ;    cx- index into strings where they differ (points at the zero byte
  18. ;        if the two strings are equal).
  19. ;    Condition codes set according to the string comparison.  You should
  20. ;    use the unsigned branches (ja, jb, je, etc.) after calling this
  21. ;    routine.
  22. ;
  23.         public    sl_strcmp
  24. ;
  25. sl_strcmp    proc    far
  26.         push    es
  27.         push    ds
  28.         push    bx
  29.         push    ax
  30.         push    si
  31.         push    di
  32. ;
  33. ; Swap pointers so they're more convenient for the LODSB/SCASB instrs.
  34. ;
  35.         xchg    si, di
  36.         mov    ax, es
  37.         mov    ds, ax
  38.         mov    es, dx
  39. ;
  40.         xor    bx, bx        ;Set initial index to zero.
  41. ;
  42. ; In order to preserve the direction flag across this call, we have to
  43. ; test whether or not it is set here and execute two completely separate
  44. ; pieces of code (so we know which state to exit in.  Unfortunately, we
  45. ; cannot use pushf to preserve this flag since we need to return status
  46. ; info in the other flags.
  47. ;
  48.         pushf
  49.         pop    ax
  50.         test    ah, 4        ;Test direction bit.
  51.         jnz    DirIsSet
  52. sclp:        lodsb
  53.         scasb
  54.         jne    scNE        ;If strings are <>, quit.
  55.         inc    bx            ;Increment index into strs.
  56.         cmp    al, 0        ;Check for end of strings.
  57.         jne    sclp
  58.         pushf
  59.         dec    bx
  60.         popf
  61. ;
  62. scNE:        pop    di
  63.         pop    si
  64.         mov    cx, bx
  65.         pop    ax
  66.         pop    bx
  67.         pop    ds
  68.         pop    es
  69.         ret            ;Return with direction flag clear.
  70. ;
  71. ;
  72. DirIsSet:    lodsb
  73.         scasb
  74.         jne    scNE2         ;If strings are <>, quit.
  75.         inc    bx
  76.         cmp    al, 0         ;Check for end of strings.
  77.         jne    DirIsSet
  78.         pushf
  79.         dec    bx
  80.         popf
  81. ;
  82. scNE2:        pop    di
  83.         pop    si
  84.         mov    cx, bx
  85.         pop    ax
  86.         pop    bx
  87.         pop    ds
  88.         pop    es
  89.         std            ;Return with direction flag set.
  90.                 ret
  91.  
  92. sl_strcmp    endp
  93. ;
  94. ;
  95. stdlib        ends
  96.         end
  97.