Plantage incomprehensible

Résolu
cs_Luong Messages postés 30 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 31 janvier 2007 - 30 janv. 2007 à 03:05
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 31 janv. 2007 à 18:20
Bonjour tout le monde,

Voila un petit bout de code qui genere un beau plantage sur mon ordi (memory could not be written) sans que je comprenne vraiment pourquoi. Cela fait il la meme chose chez vous? Et avez vous une explication?
De plus
   si j'enleve les deux premieres lignes du code (lea ...), alors c'est un autre plantage que j'obtiens. 
   si j'enleve la proc HexString du code, ca fonctionne. Pourtant HexString n'est jamais appele dans la partie principale. 
   si j'enleve les deux lignes repe et cmpsd alors ca fonctionne
   

   Je n'y comprends rien.....

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


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


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


      include C:\masm32\include\windows.inc
      include C:\masm32\include\user32.inc
      include C:\masm32\include\kernel32.inc


      includelib C:\masm32\lib\user32.lib
      includelib C:\masm32\lib\kernel32.lib


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


.data
  MonPremier     db 0E0h
  MonDeuxieme    db 010h
  MonTitre       db "Titre",0
 MaChaine       db "Essai",0


.code


start:
  lea edi,MonPremier
  lea esi,MonDeuxieme


  mov ecx,8
  std     
  repe cmpsd
  invoke ExitProcess,0


HexString Proc
  invoke MessageBox,0,ADDR MaChaine,ADDR MonTitre,MB_OK
  ret
HexString EndP


end start




Luong

5 réponses

cs_guss Messages postés 2 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 15 mai 2007
30 janv. 2007 à 12:13
Bonjour,

Essai d'ajouter l'instruction

cld

après le 'repe cmpsd'


Bonne journée
3
cs_Luong Messages postés 30 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 31 janvier 2007
30 janv. 2007 à 12:34
Merci guss. Effectivement ca marche. Pourquoi cela? Peut-on conclure a un bug de Windows?

Luong
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 janv. 2007 à 21:35
Mias non, il y a juste qu'on est prié de remettre les chose dans l'état où on les trouve.

Le mieux est tout de même de mettre au rebut ces instructions obsolètes, on fait une CompareStr() avec simplement les 3 registres généraux, rien à sauvegarder et ira largement aussi vite.

ciao...
BruNews, MVP VC++
0
cs_Luong Messages postés 30 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 31 janvier 2007
31 janv. 2007 à 10:43
Bonjour BruNews,


Je viens juste de débuter en assembleur il y a quelques semaines, d'où mon ignorance sur l'état de l'art. Merci pour l'information. C'est quoi l'histoire de CompareStr()?


Mon problème est de comparer 2 séries d'octets de même longueur de droite à gauche (les grands nombres avec l'octet de poids le plus faible en premier à la façon d'Intel) et de déterminer le plus grand nombre des 2. D'après toi, quelle serait la meilleure façon de faire?

Luong
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
31 janv. 2007 à 18:20
CompareStr() c'est juste un nom qui me semble causant, le strcmp() en C.

L'octet de poids faible se représente généralement à droite c'est ok, pour déterminer le plus grand nombre on partire donc de la gauche.

Faisons que:
 EBX = nbr octets
 ECX = tab1
 EDX = tab2

xor  eax, eax
test ebx, ebx
je   short done ; count = 0 ON SORT ILLICO
nextBT:
mov  al, [ecx]
sub  al, [edx]
jnz  short done
add  ecx, 1
add  edx, 1
sub  ebx, 1
jnz  short nextBT
done:
shl  eax, 24

En sortie si:
 EAX < 0 alors tab1 < tab2
 EAX > 0 alors tab1 > tab2 EAX 0 alors tab1 tab2

ciao...
BruNews, MVP VC++
0
Rejoignez-nous