Plantage incomprehensible [Résolu]

Signaler
Messages postés
30
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
31 janvier 2007
-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
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

Messages postés
2
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
15 mai 2007

Bonjour,

Essai d'ajouter l'instruction

cld

après le 'repe cmpsd'


Bonne journée
Messages postés
30
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
31 janvier 2007

Merci guss. Effectivement ca marche. Pourquoi cela? Peut-on conclure a un bug de Windows?

Luong
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
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++
Messages postés
30
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
31 janvier 2007

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
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
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++