Question (affectation d'un caractere)

Résolu
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011 - 23 nov. 2010 à 20:41
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 26 nov. 2010 à 23:45
bonjour,
une question simple
comment affecter à une variable un caractere??
char db ?
mov si,offset chaine
mov char,byte ptr[si]
pourquoi ça marche pas??

8 réponses

ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
23 nov. 2010 à 21:06
mov [char],byte ptr [esi] ;parait mieux ?
Pas du tout,les transactions entre mémoire doivent passer par les registres.
mov al,[esi]
mov char,al
3
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
23 nov. 2010 à 22:55
re,
juste une derniere question.
j'ai un probleme de registre que je n'arrive pas à resoudre ici.un code pour trouver la lettre la plus occurente dans la chaine
.model small
.stack 100h
.data
chaine db "je veux tester$"
char db '$'
nr dw ?
tch dw ? 
entre dw 10,13,'$'
msg4 dw "le nombre de repétion de caractére le plus reccurence est:$"  
.code
mov tch,14 
mov si,offset chaine 
mov nr,0 
mov cx,tch 
dec cx 
mov dx,si 
add dx,tch 
repete14: 
mov bx,0 
mov al,[si] 
mov char,al  
repete24: 
mov al,[si+1]
cmp al,char 
je meme 
jmp different 
meme: 
inc bx 
different: 
inc al 
cmp al,dx \\dans cette ligne,je n'ai pas su faire la modification adequate
jg repete24 
inc si 
cmp dx,nr 
jg affecter 
loop repete14 
affecter: 
mov nr,bx 
loop repete14 
mov dx,offset msg4 
mov ah,9
int 21h
mov ax,nr 
mov ah,2
int 21h
mov dx,offset entre 
mov ah,9
int 21h
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
24 nov. 2010 à 14:43
Je n'ai pas trop lu le code parce qu'il semble manquer quelque chose.
La bonne manière de procéder:
créer un tampon de 26 bytes intialiser a zero.
Différencie-t-on minuscules majuscules ?
si oui deuxieme tampon.
Si non,lire caractere:
soustraire de al,la valeur de "A"
mettre al dans bx
inc [ds:tamp+bx]
fin:
mov al,[tamp]
mov bx,1
@@:
.if al < [ds:tamp+bx]
mov al,[ds:tamp+bx]
inc bx
jmp @B
.endif
RAJOUTE la condition d'arrêt (ecx par exemple)
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
24 nov. 2010 à 20:56
re,
merci pour la reponse!!
j'ai écrit une fonction pour trouver le mot le plus long d'une chaine,ça assemble sans probleme mais l'execution ne donne pas de resultat
j'ignore la source du probleme,j'ai lu et relu le code plusieurs fois mais en vain
motch macro	
mov nbc,0
mov nbcmax,0

mov di,offset MotLong
    mov si,offset chaine
repeter :
mov al,chaine[si]
inc si
    cmp al,'0'
    je stopAjout
    cmp al,' '
je stopAjout
cmp al,','		      	  
je stopAjout			  			   		  
mov MotLong[di], al			  
inc di
add nbc,1	  
jmp repeter 
stopAjout :
mov MotLong[di] ,'0'
mov al,nbcmax
mov bl,nbc
cmp al, bl 
jg pasChangementDuMot
mov nbcmax,bl
xor di,di
repeter1 :
mov al,MotLong[di]
mov MotPlusLong[di],al
cmp al,'0'
je finChangement
inc di
jmp repeter1
finChangement :
pasChangementDuMot :
mov di,si
add di,-1
mov al,chaine[di]
cmp al,'0'
je finChaine
xor di,di
jmp repeter
finChaine :
mov ah,9
    lea dx,msg6
    int 21h	
xor di,di
mov cl,nbcmax
affiChaine :
mov dl,MotPlusLong[di]
cmp dl,'0'
je fintot
inc di
mov ah,2
int 21h
jmp affichaine
fintot :
endm
0

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

Posez votre question
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
25 nov. 2010 à 14:07
Salut
Il est très difficile de trouver une erreur à partir d'une source, surtout lorsqu'elle n'est pas documentée. Mais il y a tout de même dans ta macro des erreurs qui sautent aux yeux :
mov al,chaine[si] signifie mov al,[chaine]+[si]
c'est à dire mov al offset (chaine)+offset (chaine) alors qu'il suffit de mov al,[si].
Il en va de même pour
mov motlong[di],0 il sufit de mov [di],0
Mais la question qui se pose c'est pourquoi ne
pas utiliser Debug? Ceci vaut d'ailleurs pour la plupart des messages sur ce site.
Amicalement
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
26 nov. 2010 à 23:35
salut,


Tu as encore oublié d'initialiser tes segments !!!

@++

on peut dire que tu as de la suite dans les idées mais intel 386 en bouquin de chevet et un debugger pour comprendre ce que fais chaque ligne de code me paraît être un bonne idée.

@++
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
26 nov. 2010 à 23:41
* .MODEL SMALL

* .STACK

* .DATA

* MESSAGE DB "HELLO EVERYBODY! I AM LEARNING ASSEMBLY LANGUAGE!","$"

* .CODE

* MAIN PROC

* MOV AX, @DATA

* MOV DS,AX

* MOV AH,09

* LEA DX,MESSAGE

* INT 21H

* MOV AX,4C00H

* INT 21H

* MAIN ENDP

* END MAIN
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
26 nov. 2010 à 23:45
en mode réel:

PTR=SEG*16+OFFSET (bon sang d'bois!!!)
0
Rejoignez-nous