Erreur en assemblage

marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011 - 7 nov. 2010 à 19:46
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 5 déc. 2010 à 03:58
bonjour,j'ai écrit un code source et en assemblant j'ai eu une erreur dont j'ignore la façon de corriger qui est la suivante:
unexpected end of file encoutered
si quelqu'un peut me donner les raisons de son apparition et les manières de la corriger...
merci

59 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
16 nov. 2010 à 12:02
chaine est un pointeur vers une chaine ou un tableau de caractères ? Ca ne se déclare pas de la même manière.

mov bx,chaine[si+2] ; sert à quoi dans ton code ?

@++
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
16 nov. 2010 à 14:23
Re,
la chaine est saisie au debut par l'utilisateur,je veux la parcourir.
Mov bx,chaine[si+2]: en fait j'avais l'intention de choisir bx comme etant le registre qui donne l'indice du mot courant mais je n'ai pas su vraiment comment faire
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
16 nov. 2010 à 14:42
un truc du style
mov esi,offset chaine ou
lea esi,chaine
puis
mov bx,0
scrute:
cmp byte ptr [ds:si+bx],"$"
jz fini
inc bx
jmp scrute
fini:
;en plus on doit avoir la longueur de la chaine
;dans bx,peut être à 1 près (vérifier)
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
16 nov. 2010 à 15:42
re,


trouves toi un debugger 16 bits (il doit en exister des gratuits style turbo debugger), il faut que tu arrives a t'imager ce que donnent les données et les instructions qui y sont associées dans la memoire.

@++
0

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

Posez votre question
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
16 nov. 2010 à 16:03
au fait,

pour ton problème de compilation, tu ne serais pas sous linux par hasard ?
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
16 nov. 2010 à 17:41
re,
@ toutEnAsm : j'ai pensé à cette solution aussi mais le probleme c'est l'affichage du mot pointé par bx
@ patatalo: j'utilise emu8086,j'ai réussi à compiler mais l'exécution ne donne rien,juste une fenetre noire (j'ai essayé d'executer cette fonction seulement pour voir si elle fonctionne)et non je ne suis pas sous linux,je suis sous windows xp
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
16 nov. 2010 à 19:38
Pour débugger, utilise Insight(open-source)

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
16 nov. 2010 à 21:45
Quand on lit dans ton code:
...
cmp t_max,cx
jge stockage
stockage:
...

on se pose la question: que se passe-t-il si t_max est plus petit que cx?

En réalité, il est très difficile de trouver une erreur d'inattention dans la lecture d'une source.
Il faut en tracer l'exécution pas à pas à l'aide de Debug, par exemple et tout devient évident.
Amicalement.
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
17 nov. 2010 à 01:53
j'ai changé le registre bx par dl parce qu'il y avait un probleme de bits mais rien
une petite question en plus : est ce que l'instruction cmp al,35 qui permet de comparer al avec # est correcte? je pose cette question car en essayant de faire une saisie qui se termine par # j'ai mis cette instruction et ça ne marche pas
et cmp al,20h est elle correcte pour comparer avec les separateurs???
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
17 nov. 2010 à 15:06
Pour tester un caractere
cmp al," " ;et on a un espace
cmp al,"$"
et ainsi de suite
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 nov. 2010 à 16:26
cmp al, '$'

ciao...
BruNews, MVP VC++
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
17 nov. 2010 à 17:12
Re
donc pour comparer avec # je fais cmp al,"$" ??
mais mon probleme n'est pas encore resolu celui de trouver le mot le plus long et de l'afficher,j'ai essaye avec un debugguer mais je n'ai pas trouver la faille,je passe des heures à essayer de nouveaux trucs mais en vain ... :(((
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
17 nov. 2010 à 18:20
re,

non, tu compares bien avec cmp al,'#'. C'est que Toutenmasm pense que tu veux chercher une fin de phrase pour D.O.S.


il est normal que tu ais du mal, l'assembleur n'est pas un code que l'on apprends en baclant vite fait. Reprends cela a 0, commence par un hello world simple ou tu pourras verifier le bon fonctionnement de l'emulateur et te redonneras de l'espoir avec l'affichage d'un truc.

ensuite, avance pas à pas en comprenant bien chaque ligne de code que tu ajoutes. Commentes ton code réellement. Teste avec un debugger des petits bout de code s'il le faut.

poste tes problemes 1 à 1 en donnant bien le code complet à chaque fois. On ne risque pas de gaspiller du papier ici ;-)

@++
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
17 nov. 2010 à 21:42
Pour arriver quelque part,il faut savoir ou on va non ?
Les fins de phrases peuvent être 0 (valeur décimale) ou 13 ou "$" (ascii caractère) peut être dans ton cas.
Question:Quel est le caractere de terminaison de ligne ?. Un debugger peut aider içi.
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
17 nov. 2010 à 23:11
re,
je suis bien conscient que l'assembleur ne s'apprend pas en quelques secondes mais je vous assure que je fais ce que je peux pour apprendre,déja à la fac on a étudié l'assembleur en 3h seulement et on nous demande de faire des tps compliqués,ils veulent qu'on apprend tout seul donc j'essaie de faire le max et c'est pourquoi je demande votre aide.
j'ai essayé cmp al,"#" auparavant pour la saisie d'une phrase qui se termine par # mais ça ne marche pas,la saisie continue meme en tapant #
voici le code

.model small
.stack 100h
.data
msg db 10,13,"saisir une phrase :  $"
msg1 db 10,13,"la chaine saisie est : $"
msg2 db 10,13,"la taille de la chaine saisie est : $"
chaine db ?
taille dw ?
.code
start:
mov ax,@data
mov ds, ax
mov ah,9
mov dx,offset msg \\affichage du 1er msg
int 21h
mov taille,0 \\initialisation de la taille

lea si,chaine
comparaison:
mov ah,1     \\saisie de la chaine
int 21h 
mov ah,[si]
cmp ah,'$'
jz fin
cmp ah,"#"  \\COMPARAISON AVEC # QUI MARQUE LA FIN DE LA CHAINE
je yess
inc taille
inc si
jmp comparaison
yess:
mov ah,09h
mov dx,offset msg1
int 21h
mov ah,09h
mov dx, offset chaine
int 21h
mov ah,09h
mov dx,offset msg2
int 21h
mov bx,taille
mov ah,01h
int 21h
fin:
mov ah,4ch
int 21h
end start
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
18 nov. 2010 à 14:59
Je peux me tromper mais il me semble que la fonction 1 de l'interruption 21h retourne le caractere lu par ax (ah,al..).
Après il faut mettre al dans le tampon si on veut le lire dans le tampon.
Sinon,on evite de modifier al par:
"mov al,[si]" et à la place:
cmp al,"#"
jz fin
mov [si],al
inc si
jmp comparaison
fin:
......
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
18 nov. 2010 à 15:25
re,
merci pour cette remarque,le probleme reside maintenant dans l'affichage de la taille de la chaine saisie,il m'affiche une valeur fausse
voici le code aprés modification
.model small
.stack 200h
.data
msg db 10,13,"saisir une phrase :  $"
msg2 db 10,13,"la taille de la chaine saisie est : $"
chaine db ?
taille dw ?
.code
start:
mov ax,@data
mov ds, ax
mov ah,9
mov dx,offset msg
int 21h
mov taille,0

lea si,chaine
comparaison:
mov ah,1
int 21h 
cmp al,"0"
jz yess
mov [si],al
inc si
inc taille
jmp comparaison
yess:
mov ah,9
mov dx,offset msg2
int 21h
mov ah,2
mov bx,taille
int 21h
mov ah,4ch
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 à 01:01
chaine db ? n'est toujours pas bon. Tu dois déclarer un tableau. Je ne sais pas comment en tasm, regarde la doc.

masm:
#define TAILLE_CHAINE 128
chaine db TAILLE_CHAINE du(?)

nasm:
%define TAILLE_CHAINE 128
chaine resb TAILLE_CHAINE
ou
times TAILLE_CHAINE db 0

pour que tu arrête la saisie avec '#', tu dois tester caractère par caractère. fonction dos avec taille = 1 ou fonction bios (16h).
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 à 01:02
pardon,

masm:
#define TAILLE_CHAINE 128
chaine db TAILLE_CHAINE dup(?); ou dup(0)


@++
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 à 01:08
ça fait longtemps:

masm:
TAILLE_CHAINE EQU 128
...
0
Rejoignez-nous