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
Bonjour,

salut tout le monde !! j'éspere que vous étes bien , je voulais demander votre aide pour comprendre quelque chose sur la programmation assembleur , je savais , que ce forum concerne le language c , mais puisque ca a une relation avec c !
bon , je suis débutant dans la programmation,
je voulais fair un petit programme en assembleur de l'addition, pour le faire notre professeur nous a demandé d'utiliser cette instruction :
or ax,3030h
mais j'ai nul compris !!
ca sert a quoi ?????
autre chose , par exemple en c si j'écris quelchose et j'ouvers l'accolade comme ca { ..... } , en assembleur qu'il est l'indice qui signifie ceci , par exemple :

1 : cmp al,09h
2 : JLE inf
3 : add al,06h
4 : mov ah,al
5 : and ax,0f00fh
6 : mov cl ,4
7 : shr ah,cl
8 : or ax,3030h
9 : push ax
10 :mov dl,ah
11 : mov ah,02h
12 : int 21h
13 : pop ax
14 : mov dl,al
15 : mov ah,02h
16 : int 21h
17 : JMP fin
18 : inf : add al,30h
19 : mov dl,al
20 : mov ah,02h
21 : int 21h
22 : fin : mov ah,01h
23 : int 21h
24 : mov ah,4ch
25 : int 21h

dans le deuxiéme ligne on a JLE inf
directement dans la compilation , le compilateur va passer au 18éme ligne (ces nombres seulements pour vous facilier d'aller directement a l'instruction au lieu de chercher ...) , ma question ici , dans c les accolades se sont ceux qui indique la fin des instruction pour distinguer entre cela et ceci, mais ici dans l'assembleur y'a pas des accolade !!! comment le compilateur va savoir que les autres instruction concerne ''' inf ''' ou nn ! ???
autre chose et le dernier : maintenant le compilateur est dans le 18 ligne ,d'habitude en c il va terminer mais dans assembleir , est ce qu'il va revenir au 2éme ligne (bien sur si la condition était vérifié) et suivre les autres étapes??? ou nn il va terminer 18,19... jusqk 25 ???
c'est la folie nn ??
s'il vous plaaaaait aider moi !!!!!!!!!

7 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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,
1
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
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 ???
0
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
pour l'information nous utilisons , fasm 1.71
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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).
0

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
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 ??
0
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
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
0
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
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
0
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
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.
0
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
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 !!!
0
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
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
0
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
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/
0
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
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:

// 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...
0