bonjour à tous,
tout d'abord,
le sujet.
un collègue, a fabriqué, pour moi, un .exe en vb4, celui ci fait appelle à une dll, écrite en assembleur (masm32), le tous fonctionne bien sous win98, mais "plante" sous win xp.
but du prog:
interrogation de l'état de la broche 6 (DSR) du port com1, à une fréquence élévée, au delà des capacités de réponse, de l'api win xp dédiée. ce qui explique que l'on n'y fasse pas appelle.
le programme "plante" lors de l'instruction "in" notament (boucle1 dans le .asm utiliser pour la dll) mais pas seulement.
l'explication mon collègue la connait:
on essaye de récupérer des informations, à des "emplacements" où il nous est "interdit d'accèder" par xp (protection)
la question maintenant:
comment devrait-on faire pour obtenir le résultat souhaité, tout en respectant les règles de programmation sous xp.
j'espère avoir été clair dans mon explication.
je place ci-dessous le contenu du .asm utilisé pour plus de clareté.
merci d'avance
cordialement
;Code:««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« comment * ----------------------------------------------------- début fonction MESURE: Cette fonction renvoie le nb changements etats de DSR (com1) [DWORD] ,pendant le temps "nb_cycl" passé en argument [WORD] . ------------------------------------------------------- * mesure PROC nb_cycl:WORD ;nb_cycl contient nb pas de 54.9 ms LOCAL com_prec :BYTE LOCAL count_fin :WORD ;heure fin LOCAL count_deb :WORD ;heure debut LOCAL count_com :DWORD ;nb changements etats DSR (com1) pushcontext all pushfd ;debut time dans bx push ds mov bx,040h mov ds,bx mov bx,word ptr ds:[06Ch] pop ds ;fin time dans bx mov count_deb,bx .while count_deb==bx ;synchro compteur temps. ;debut time dans bx push ds mov bx,040h mov ds,bx mov bx,word ptr ds:[06Ch] pop ds ;fin time dans bx .endw add bx,nb_cycl mov count_fin,bx mov count_com,0 ;debut mesure nb cycles push ds mov dx,040h mov ds,dx mov dx,word ptr ds:[0000h] ; met adresse de COM1 dans dx. pop ds add dx,6 ; met adresse du registre d'etat de COM1 dans dx. in al,dx and al,20h ;mesure le bit 5 de COM1 mov com_prec,al boucle1 LABEL near ;entree du test in al,dx and al,20h ;mesure le bit 5 de COM1 .if al != com_prec mov com_prec,al inc count_com .endif ;debut time dans bx push ds mov bx,040h mov ds,bx mov bx,word ptr ds:[06Ch] pop ds ;fin time dans bx .if bx != count_fin jmp boucle1 .endif popfd popcontext all return count_com mesure ENDP
-----