What should I look out for to make sure an XP application is downward compatible with Win 98?
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
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
Hmm, ::)
Thats odd. I say you use the szCmpi function in MASM32.LIB instead. It is much faster too
Thomas :U
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.
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
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.
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
Just a minor whinge. "test eax, eax" is smaller and does the same job as "cmp eax,0"
regards,
-Brent
Brent,
You are right. I had stated something very similar in the compare line as a comment. Perhaps you missed it.
Paul
test eax, 0 is the same size as cmp eax, 0. test eax, eax on the other hand is one byte shorter.
um, AND with 0 always produces 0, so TEST against 0 will always set ZF.