Votre aide s'il vous plaait :/ ?
Résolu/Fermé
DevGl
Messages postés
136
Date d'inscription
samedi 23 novembre 2013
Statut
Membre
Dernière intervention
16 mai 2015
-
Modifié par DevGl le 3/02/2014 à 20:28
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 27 févr. 2014 à 21:10
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 27 févr. 2014 à 21:10
7 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
3 févr. 2014 à 22:44
3 févr. 2014 à 22:44
Bonjour,
Oui, enfin ton post a plus d'assembleur que de C. Je le redirige donc dans la bonne catégorie.
Faudrait également préciser en quel assembleur. Et pour info, il n'y a pas de compilateur en assembleur.
Sinon, pas d'accolages non plus. Le code suit simplement les instructions. Si pas de jump ou équivalent, il exécute l'instruction d'après. Mais tu peux utiliser des procédures (via call / leave / ret, ça dépend de l'assembleur).
Cdlt,
Oui, enfin ton post a plus d'assembleur que de C. Je le redirige donc dans la bonne catégorie.
Faudrait également préciser en quel assembleur. Et pour info, il n'y a pas de compilateur en assembleur.
Sinon, pas d'accolages non plus. Le code suit simplement les instructions. Si pas de jump ou équivalent, il exécute l'instruction d'après. Mais tu peux utiliser des procédures (via call / leave / ret, ça dépend de l'assembleur).
Cdlt,
DevGl
Messages postés
136
Date d'inscription
samedi 23 novembre 2013
Statut
Membre
Dernière intervention
16 mai 2015
3 févr. 2014 à 22:48
3 févr. 2014 à 22:48
oui vous avez raison , mais dites moi , si une des condition est vérifié , et on a fait du jmp , aprés les instructions du jmp , est ce qu'il va revenir ou il était , et suivre les étapes , comme dans c quand on fait l'appele a une fonction et aprés on revient ou nous étions ?? c'est ca ?? ou nn ???
DevGl
Messages postés
136
Date d'inscription
samedi 23 novembre 2013
Statut
Membre
Dernière intervention
16 mai 2015
3 févr. 2014 à 22:49
3 févr. 2014 à 22:49
pour l'information nous utilisons , fasm 1.71
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
3 févr. 2014 à 22:58
3 févr. 2014 à 22:58
si une des condition est vérifié , et on a fait du jmp , aprés les instructions du jmp , est ce qu'il va revenir
Ben, j'ai répondu à ta question ci-dessus...
Le programme suit simplement les instructions. S'il y a un jmp (ou équivalent), il saute à l'adresse sinon il exécute l'instruction suivante. Exception faite pour les procédures (call / leave / ret).
Ben, j'ai répondu à ta question ci-dessus...
Le programme suit simplement les instructions. S'il y a un jmp (ou équivalent), il saute à l'adresse sinon il exécute l'instruction suivante. Exception faite pour les procédures (call / leave / ret).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
DevGl
Messages postés
136
Date d'inscription
samedi 23 novembre 2013
Statut
Membre
Dernière intervention
16 mai 2015
4 févr. 2014 à 00:29
4 févr. 2014 à 00:29
aaah bon , j'ai compris , et dans le code ci-dessus d'assembleur que j'ai donné , est que vous pouvez me dire pourquoi dans l'addition nous devons comparer la somme des 2 nombres quand a dejà saisi avec le nombre 9 , et faire tout ca en suite ?? j'ai pas compris l'idée que ce qu'on fait exactement ?? pourquoi tut cette complexité pour additionner 2 nombres ??
DevGl
Messages postés
136
Date d'inscription
samedi 23 novembre 2013
Statut
Membre
Dernière intervention
16 mai 2015
4 févr. 2014 à 00:31
4 févr. 2014 à 00:31
voila le code complet
format mz
org 100h
mov ah,01h
int 21h
mov dl,al
push dx
mov ah,01h
int 21h
pop dx
sub dl,30h
sub al,30h
add al,dl
cmp al,09h
JLE inf
add al,06h
mov ah,al
and ax,0f00fh
mov cl ,4
shr ah,cl
or ax,3030h
push ax
mov dl,ah
mov ah,02h
int 21h
pop ax
mov dl,al
mov ah,02h
int 21h
JMP fin
inf : add al,30h
mov dl,al
mov ah,02h
int 21h
fin : mov ah,01h
int 21h
mov ah,4ch
int 21h
format mz
org 100h
mov ah,01h
int 21h
mov dl,al
push dx
mov ah,01h
int 21h
pop dx
sub dl,30h
sub al,30h
add al,dl
cmp al,09h
JLE inf
add al,06h
mov ah,al
and ax,0f00fh
mov cl ,4
shr ah,cl
or ax,3030h
push ax
mov dl,ah
mov ah,02h
int 21h
pop ax
mov dl,al
mov ah,02h
int 21h
JMP fin
inf : add al,30h
mov dl,al
mov ah,02h
int 21h
fin : mov ah,01h
int 21h
mov ah,4ch
int 21h
nicocorico
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
138
Modifié par nicocorico le 4/02/2014 à 18:56
Modifié par nicocorico le 4/02/2014 à 18:56
Bonjour,
alors, je fais assez court, désolé j'ai peu de temps mais j'y reviendrais si nécessaire!
Or AX,3030h -> l'opérateur "or" va mettre à 1 les bits étant à 1 dans l'opérande, donc après cette opération tous les bits contenus dans 3030h seront à 1 dans AX, sans modifier les autres...
Huum, concernant les accolades hé bien, en fait les nombres avec les deux points ne doivent pas se trouver dans le corps du programme car ils sont considérés comme des étiquettes! Une étiquette précède l'instruction et est suivi de deux points, c'est simplement de cette façon que le "compilateur" détermine que c'en est bien une.
Ensuite, le saut conditionnel "jle" n'est pas prévu pour revenir, car ça nécessite une action supplémentaire: Pour revenir, il faut savoir où revenir! Donc l'instruction d'appel de fonction "call" retient l'adresse en l'empilant sur la pile puis effectue le saut, ensuite l'instruction de retour "ret" dépile l'adresse et y revient...
Le chêne aussi était un gland, avant d'être un chêne
alors, je fais assez court, désolé j'ai peu de temps mais j'y reviendrais si nécessaire!
Or AX,3030h -> l'opérateur "or" va mettre à 1 les bits étant à 1 dans l'opérande, donc après cette opération tous les bits contenus dans 3030h seront à 1 dans AX, sans modifier les autres...
Huum, concernant les accolades hé bien, en fait les nombres avec les deux points ne doivent pas se trouver dans le corps du programme car ils sont considérés comme des étiquettes! Une étiquette précède l'instruction et est suivi de deux points, c'est simplement de cette façon que le "compilateur" détermine que c'en est bien une.
Ensuite, le saut conditionnel "jle" n'est pas prévu pour revenir, car ça nécessite une action supplémentaire: Pour revenir, il faut savoir où revenir! Donc l'instruction d'appel de fonction "call" retient l'adresse en l'empilant sur la pile puis effectue le saut, ensuite l'instruction de retour "ret" dépile l'adresse et y revient...
Le chêne aussi était un gland, avant d'être un chêne
nicocorico
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
138
4 févr. 2014 à 18:52
4 févr. 2014 à 18:52
Quant à ta seconde question, hé bien en fait "cmp al,09" ne modifie pas le registre "al", donc c'est pas une simple addition, c'est qu'on compare le registre "al" à 9, et on saute selon le résultat de cette comparaison.
DevGl
Messages postés
136
Date d'inscription
samedi 23 novembre 2013
Statut
Membre
Dernière intervention
16 mai 2015
6 févr. 2014 à 01:01
6 févr. 2014 à 01:01
Aaah ouuii j'ai compris merci beaucoup Nicocorico pour l'aide !! vrémenent , est ce que vous pouvez me dire autre chose ? d'habitude en c on fait tout ce qu'on veut sans prendre en consideration est que le compilateur va se souvener des contenu des variable et tout meme si qu'on utilisé plusieurs instructions , main en assembleur , nous devans utiliser les ' push" , et "pop" pour garder la valeur qu'on a affecté a un registre .. , ca on l'utilise si on fait du saut dans notre code par exemple
mov ah,01h
int 21h
mov dl,al
push dx
mov dx,saut
mov ah,09h
int 21h
saut dx ,
je voulais savoir, est que seulement dans les saut qu'on qu'on peut risquer de perdre nos valeur ?? ou bien il y'en a d'autres cas? , est ce que si on a utilisé des jmp , et si les conditions sont vérifié , avans l"utilisé , il faut fair du push , et au mileux des instructions du jmp on fait les push ?? ou bien nn , seulement quand on fait du saut ?? repondez moi s'il vous plaaait !!!
mov ah,01h
int 21h
mov dl,al
push dx
mov dx,saut
mov ah,09h
int 21h
saut dx ,
je voulais savoir, est que seulement dans les saut qu'on qu'on peut risquer de perdre nos valeur ?? ou bien il y'en a d'autres cas? , est ce que si on a utilisé des jmp , et si les conditions sont vérifié , avans l"utilisé , il faut fair du push , et au mileux des instructions du jmp on fait les push ?? ou bien nn , seulement quand on fait du saut ?? repondez moi s'il vous plaaait !!!
DevGl
Messages postés
136
Date d'inscription
samedi 23 novembre 2013
Statut
Membre
Dernière intervention
16 mai 2015
6 févr. 2014 à 01:03
6 févr. 2014 à 01:03
le code plutot devrait aitre :
mov ah,01h
int 21h
mov dl,al
push dx
mov dx,saut
mov ah,09h
int 21h
pop dx
mov ah,01h
int 21h
mov dl,al
push dx
mov dx,saut
mov ah,09h
int 21h
pop dx
nicocorico
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
138
Modifié par nicocorico le 6/02/2014 à 21:02
Modifié par nicocorico le 6/02/2014 à 21:02
Non non, en fait ce qu'il faut comprendre c'est que les registres ne sont pas modifiés sans raison apparente! Les registres ne sont pas modifiés dans le cas des sauts, ni des call! En fait les instructions "call-ret" servent à faire un appel de fonction (comme en C donc) c'est à dire que l'éxécution se poursuit à l'endroit déterminé au moment du call jusqu'à ce qu'une instruction "Ret" force le retour au point de départ... alors que le "jmp" se contente d'un aller simple. Donc, étant donné qu'une fonction peut en appeler une autre, etc.., hé bien il faut retenir chaque adresse de retour! Ainsi à n'importe quel endroit du programme on peut appeler des fonctions sans perdre le fil du programme appelant.. Et comme chaque fonction peut appeler une autre fonction, il faut pouvoir retenir un nombre indéterminé d'adresse, donc c'est la pile qui est utilisée pour ça: La pile est tout simplement un espace en mémoire, et le processeur contient un registre (esp) qui pointe dessus; Ce registre est incrémenté et décrémenté à chaque fois qu'on empile et dépile, donc à chaque fois qu'on fait un push, on ajoute une valeur en haut de la pile, et quand on dépile, ça retire la valeur qui est tout en haut. Donc on dépile dans l'ordre inverse de l'empilement pour retrouver les valeurs dans le bon ordre. et on se sert éventuellement de ce mécanisme pour retenir temporairement des données, pour les variables locales des programmes ou pour passer des paramètres aux fonctions.
Et donc pour en revenir au "call" et au "jmp", en fait le call est un jmp avec empilement d'adresse, et le "ret" dépile l'adresse et fait un "jmp" dessus en passant à la ligne suivante, donc l'éxécution se poursuit ensuite à l'instruction suivant le "call". Le jmp lui, est un saut simple, c'est comme un saut conditionnel mais sans condition, tout simplement!
En fait un jmp sert à passer à la suite du programme dans certains cas précis, alors qu'un call sert à effectuer un traitement temporaire dans le code en cours sans l'interrompre.
Par exemple, on va faire un "call" vers une fonction de tracé de ligne, et comme toutes les fonctions finissent par "ret", la ligne va être tracée et la main sera rendu à l'appelant quel qu'il soit...
J'ai cherché un peu des sites qui pourraient être utile pour apprendre les bases, mais je trouve rien de vraiment bien! C'est très austère!
https://asm.developpez.com/intro/
Et donc pour en revenir au "call" et au "jmp", en fait le call est un jmp avec empilement d'adresse, et le "ret" dépile l'adresse et fait un "jmp" dessus en passant à la ligne suivante, donc l'éxécution se poursuit ensuite à l'instruction suivant le "call". Le jmp lui, est un saut simple, c'est comme un saut conditionnel mais sans condition, tout simplement!
En fait un jmp sert à passer à la suite du programme dans certains cas précis, alors qu'un call sert à effectuer un traitement temporaire dans le code en cours sans l'interrompre.
Par exemple, on va faire un "call" vers une fonction de tracé de ligne, et comme toutes les fonctions finissent par "ret", la ligne va être tracée et la main sera rendu à l'appelant quel qu'il soit...
J'ai cherché un peu des sites qui pourraient être utile pour apprendre les bases, mais je trouve rien de vraiment bien! C'est très austère!
https://asm.developpez.com/intro/
nicocorico
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
138
Modifié par nicocorico le 6/02/2014 à 21:17
Modifié par nicocorico le 6/02/2014 à 21:17
En fait les compilateurs eux-mêmes auraient très bien pu implémenter le principe de fonctions sans l'aide du processeur, puisqu'il leur suffit de faire ceci:
En fait c'est l'équivalent de ce qu'on trouve avec "call-ret"
Voilà, en fait l'adresse de retour est en quelque sort un paramètre obligatoire qui est passé à la fonction par l'intermédiaire de la pile.
Et donc le processeur intègre les mots clés "call-ret" tout simplement parce que les appels de fonction sont légions et ils devaient être optimisés et prendre le moins de place possible dans le code...
// définition d'une fonction
Fonction1:
// code de la fonction
// ...
// fin de la fonction
Pop DX // dépile l'adresse de l'appelant
Jmp DX // Saute à l'adresse sauvée, c'est à dire l'étiquette @retour
// Corps du programme principal (main)
Push @retour // Sauve l'adresse de retour sur la pile
Jmp Fonction1 // Saute à la fonction
@retour:
En fait c'est l'équivalent de ce qu'on trouve avec "call-ret"
// définition d'une fonction
Fonction1:
// code de la fonction
// ...
// fin de la fonction
Ret // Saute à l'adresse sauvée, c'est à dire l'étiquette @retour
// début du programme
call Fonction1 // Sauve l'adresse de retour et saute à la fonction
@retour: // l'exécution continuera ici après retour de fonction
Voilà, en fait l'adresse de retour est en quelque sort un paramètre obligatoire qui est passé à la fonction par l'intermédiaire de la pile.
Et donc le processeur intègre les mots clés "call-ret" tout simplement parce que les appels de fonction sont légions et ils devaient être optimisés et prendre le moins de place possible dans le code...