News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

XP to 98 downward compatibility

Started by Mr Earl, May 07, 2005, 07:34:09 PM

Previous topic - Next topic

Mr Earl

What should I look out for to make sure an XP application is downward compatible with Win 98?

doomsday

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

Mr Earl

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

thomasantony

Hmm, ::)
  Thats odd. I say you use the szCmpi function in MASM32.LIB instead. It is much faster too

Thomas :U
There are 10 types of people in the world. Those who understand binary and those who don't.


Programmer's Directory. Submit for free

Mr Earl

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.

pbrennick

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

Mr Earl

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.

pbrennick

#7
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

doomsday

Just a minor whinge.  "test eax, eax" is smaller and does the same job as "cmp eax,0"

regards,
-Brent

pbrennick

Brent,
You are right.  I had stated something very similar in the compare line as a comment.  Perhaps you missed it.

Paul

roticv

test eax, 0 is the same size as cmp eax, 0. test eax, eax on the other hand is one byte shorter.

tenkey

um, AND with 0 always produces 0, so TEST against 0 will always set ZF.
A programming language is low level when its programs require attention to the irrelevant.
Alan Perlis, Epigram #8