Je bloque!!!!

marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011 - 18 nov. 2010 à 23:48
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011 - 21 nov. 2010 à 17:00
bonjour,
j'ai ecrit un code assembleur qui compte le nombre des séparateurs dans une chaine saisie,en assemblant tout va bien mais l'execution ne donne pas le resultat attendu,elle donne rien meme je ne sais pas où reside l'erreur.J'ai même utilisé un debugger mais je n'ai pas trouvé la faille.si vous pouvez bien m'aider ça serait gentille
voici mon code:
.model small
.stack 200h
.data
chaine db 10,13,"je veux tester seulement$"
msg5 db 10,13, "le nombre de separateur est:$"
.code
start:
mov ax,@data
mov ds, ax  
xor CX, CX \\initialisation du compteur de sep
lea si,chaine \\on pointe si
boucle: 
mov [si],al
cmp al," "   \\comparaison avec un espace (comme essaie)
jz separateur
cmp al,'$' \\verifier si c'est la fin de la chaine
jz fin
jmp incrementation
 
fin: 
mov ah,9
lea dx,msg5  
int 21h 
mov ah,2  \\affichage du nbre de separateurs
mov dx,cx
int 21h 
incrementation:
inc si
jmp boucle
separateur: 
inc cx   
jmp incrementation
end start

11 réponses

marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
19 nov. 2010 à 00:02
OUUUUPS une petite erreur à corriger:
on remplace mov [si],al
par mov al, BYTE PTR [bx]
mais maintenant le resultat est le suivant:
au lieu d'afficher le nombre de separateurs,il affiche le msg5 à chaque fois il rencontre un separateurs et il bloque dans une boucle infinie (constaté en utilisant un debugger)
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
19 nov. 2010 à 00:20
j'allais le dire mais j'aurais plutôt remplacé par mov al,[si] ;al est forcement un byte.

@++
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
19 nov. 2010 à 00:30
allez, je suis de bonne humeur

en nasm:

xor ax,ax; ax = 0
xor cx,cx
lea si,[chaine]; si pointe vers chaine
.1
cmp byte ptr[si],' '; compare *si == ' '
sete al; al = 1 si oui
add cx,ax; cx = cx + ax
cmp byte ptr[si],'$'; compare *si == '$'
lea si,[si+1];incremente si sans chg flags
jne .1

@++
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
19 nov. 2010 à 01:31
re,
vraiment merci pour la reponse!!!
le petit hic c'est SETE, ça n'existe pas en tasm,il m'affiche l'erreur suivante
illegal instruction for currently selected processor
par quoi je peux la remplacer??
0

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

Posez votre question
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
19 nov. 2010 à 01:53
j'ai essayé comme suit mais ça ne marche pas
.model small
.stack 200h
.data
chaine db 10,13,"je veux tester seulement$"
msg5 db 10,13, "le nombre de separateur est:$"

.code
start:
mov ax,@data
mov ds, ax  
xor ax,ax
xor cx,cx 
lea si,[chaine]
boucle: 
cmp byte ptr[si],' '
jc ajouter
ajouter:
add cx,ax
cmp byte ptr[si],'$'
lea si,[si+1]
jne boucle 
 
mov ah,9
lea dx,msg5 
int 21h 
mov ah,2
mov dx,cx
int 21h 

end start
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
19 nov. 2010 à 09:41
sete, ç'est peut-être effectivement du 486. Regarde les options d'assemblage, tu dois pouvoir modifier la machine. Sinon, il y a plein d'autres possibilitées.

Avec masm, tu peux préciser .386, .486, ... et tasm ressemble beaucoup a masm.


@++
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
19 nov. 2010 à 09:49
xor cx,cx; cx = 0
lea si,[chaine]; si pointe vers chaine
jmp short .3
.1
inc cx
.2
inc si
.3
cmp byte ptr[si],' '; compare *si == ' '
je .1
cmp byte ptr[si],'$'; compare *si == '$'
jne .2

@++
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
19 nov. 2010 à 13:15
re,merci infiniment pour cette aide
j'ai utilisé aprés une fonction pour convertir ce nombre binaire que contient cx en une chaine,le resultat affiché est correcte mais juste aprés le resulta il affiche aussi une chaine avec des caracteres bizarres,comment je peux l'enlever??
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
19 nov. 2010 à 15:08
tu as certainemnt un problème de terminaison de phrase.

Après le nombre transformé en ascii, il faut ajouter un caractère '$' pour D.O.S.

@++
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
20 nov. 2010 à 00:04
re,
euuh je n'ai pas bien compris
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
21 nov. 2010 à 17:00
re,
j'ai trouver la solution,merci en tout cas
0
Rejoignez-nous