Question (affectation d'un caractere) [Résolu]

Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011
- - Dernière réponse : 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??
Afficher la suite 

8 réponses

Meilleure réponse
Messages postés
552
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
1
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 220 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ToutEnMasm
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011
0
Merci
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
Commenter la réponse de marooh
Messages postés
552
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
1
0
Merci
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)
Commenter la réponse de ToutEnMasm
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011
0
Merci
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
Commenter la réponse de marooh
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
0
Merci
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
Commenter la réponse de Guilou34
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
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.

@++
Commenter la réponse de cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
* .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
Commenter la réponse de cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
en mode réel:

PTR=SEG*16+OFFSET (bon sang d'bois!!!)
Commenter la réponse de cs_patatalo