The MASM Forum Archive 2004 to 2012

General Forums => The Campus => Topic started by: Mr Earl on May 07, 2005, 07:34:09 PM

Title: XP to 98 downward compatibility
Post by: Mr Earl on May 07, 2005, 07:34:09 PM
What should I look out for to make sure an XP application is downward compatible with Win 98?
Title: Re: XP to 98 downward compatibility
Post by: doomsday on May 07, 2005, 08:00:09 PM
Without more specific info on what sort of program you're writing the only thing I could suggest is to check your Windows API docs to make sure that which-ever APIs you're calling are not post-Windows98, and definately test your program on a 98 box.

regards,
-Brent
Title: Re: XP to 98 downward compatibility
Post by: Mr Earl on May 07, 2005, 10:49:05 PM
Brent, 
Thanks.  I am testing the application on a 98 box now.  The pgm wouldn't run on 98, and I found that a "lstrcmpi" which gave equal on XP was not giving equal on 98.  At that point I knew I needed to know more about compatibility before I went further.   
Steve
Title: Re: XP to 98 downward compatibility
Post by: thomasantony on May 08, 2005, 08:42:59 AM
Hmm, ::)
  Thats odd. I say you use the szCmpi function in MASM32.LIB instead. It is much faster too

Thomas :U
Title: Re: XP to 98 downward compatibility
Post by: Mr Earl on May 08, 2005, 11:07:05 AM
Hi,
My masm32.lib doesn't have szCmpi, I tried cmpsi and that works.   lstrcmp also works.  It seems at this point that only lstrcmpi is giving me problems.  I'll change that in all the programs and see how far that gets me.  Thanks.
Title: Re: XP to 98 downward compatibility
Post by: pbrennick on May 09, 2005, 04:55:59 AM
Mr. Earl,
szcmpi.asm is in that library...


; #########################################################################

    .486
    .model flat, stdcall
    option casemap :none   ; case sensitive

    .code

; ########################################################################

szCmpi proc src:DWORD, dst:DWORD, ln:DWORD

  ; -----------------------------------------------------------
  ; algorithm compares any two byte sequences CASE INSENSITIVE
  ; and returns zero if they are identical or the character
  ; count where the two byte sequences mismatch.
  ; -----------------------------------------------------------

    push ebx
    push esi
    push edi

    jmp @F
    align 16
  table:
    db   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15
    db  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
    db  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47
    db  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63
    db  64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111
    db 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95
    db  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111
    db 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127
    db 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143
    db 144,145,146,147,148,149,150,151,152,153,154,155,156,156,158,159
    db 160,161,162,163,164,165,166,167,168,169,170,171,172,173,173,175
    db 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191
    db 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207
    db 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223
    db 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239
    db 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
  @@:

    lea ebx, table      ; table base address
    mov esi, src        ; 1st string in ESI
    mov edi, dst        ; 2nd string in EDI
    mov ecx, ln         ; length in ECX
    add ecx, esi        ; add ESI to get exit condition

  @@:
    mov al, [esi]       ; get 1st byte
    inc esi
    xlatb               ; replace it with byte in table
    mov ah, al          ; store it in AH
    mov al, [edi]       ; get 2nd byte
    inc edi
    xlatb               ; replace it with byte in table
    cmp ah, al          ; compare if equal
    jne @F              ; jump out if not equal
    cmp esi, ecx        ; exit on length
    jl @B
  @@:

    sub esi, src

    .if esi == ln
      xor eax, eax
    .else
      mov eax, esi
    .endif

    pop edi
    pop esi
    pop ebx

    ret

szCmpi endp

; ########################################################################

end


hth,
Paul
Title: Re: XP to 98 downward compatibility
Post by: Mr Earl on May 09, 2005, 11:20:17 AM
Thanks Paul,
It turns out that the problem was my mistake.

Instead of doing this:


       INVOKE   lstrcmpi, addr szBuff0, addr szBuff1
      .if !eax
              mov     SameDir, 1
      .endif

I was using this:

      INVOKE   lstrcmpi, addr szBuff0, addr szBuff1
      jnz  @F
      mov   SameDir, 1


It seems that XP leaves the ZERO Flag set after "lstrcmpi", but 98 SE does not.
Title: Re: XP to 98 downward compatibility
Post by: pbrennick on May 10, 2005, 07:31:55 AM
Mr. Earl,

I think that you should say that 98 assumes you are testing flags with jnz @f.  XP is forcing you to be more specific.

This should also work:


      INVOKE   lstrcmpi, addr szBuff0, addr szBuff1
      cmp eax, 0  ; test eax, 0 also works
      jnz  @F
      mov   SameDir, 1


Paul
Title: Re: XP to 98 downward compatibility
Post by: doomsday on May 10, 2005, 03:04:14 PM
Just a minor whinge.  "test eax, eax" is smaller and does the same job as "cmp eax,0"

regards,
-Brent
Title: Re: XP to 98 downward compatibility
Post by: pbrennick on May 10, 2005, 03:22:25 PM
Brent,
You are right.  I had stated something very similar in the compare line as a comment.  Perhaps you missed it.

Paul
Title: Re: XP to 98 downward compatibility
Post by: roticv on May 11, 2005, 01:09:19 PM
test eax, 0 is the same size as cmp eax, 0. test eax, eax on the other hand is one byte shorter.
Title: Re: XP to 98 downward compatibility
Post by: tenkey on May 14, 2005, 10:53:37 PM
um, AND with 0 always produces 0, so TEST against 0 will always set ZF.