[Débutant] Langage Assembleur
Résolu/Fermé
Caliphe
Messages postés
31
Date d'inscription
dimanche 3 mai 2015
Statut
Membre
Dernière intervention
24 février 2016
-
Modifié par Caliphe le 20/06/2015 à 21:31
Caliphe Messages postés 31 Date d'inscription dimanche 3 mai 2015 Statut Membre Dernière intervention 24 février 2016 - 23 juin 2015 à 17:27
Caliphe Messages postés 31 Date d'inscription dimanche 3 mai 2015 Statut Membre Dernière intervention 24 février 2016 - 23 juin 2015 à 17:27
A voir également:
- [Débutant] Langage Assembleur
- Langage ascii - Guide
- Langage binaire - Guide
- Logiciel de programmation pour débutant - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage pascal - Télécharger - Édition & Programmation
3 réponses
Utilisateur anonyme
22 juin 2015 à 00:11
22 juin 2015 à 00:11
Bonjour
Question 1 : l'idée est bonne, mais on te demande l'adresse du début du programme, et toi tu as calculé celle de la troisième instruction. Il faut retirer le nombre d'octets des deux premières instructions.
Pour ça, il faut que tu les traduises en langage machine, soit manuellement - on a bien dû te donner une liste des instructions du processeur avec leur codage - soit avec un assembleur.
Question 2 : Il faut faire la même chose, mais en allant vers la fin du programme au lieu de remonter au début.
Question 3 : En faisant l'assemblage du programme pour les deux premières questions, tu auras déterminé les codes de toutes les instructions. Et tu sais que la troisième commence à CS:IP = 1492:0005. En fait, tu as déjà dû remplir ce tableau pour répondre aux deux premières questions.
Pour les données, il n'y en a qu'une, on peut légitimement supposer qu'elle est à l'offset 0, et le segment t'est donné dans l'un des registres avec l'image du debug.
Question 1 : l'idée est bonne, mais on te demande l'adresse du début du programme, et toi tu as calculé celle de la troisième instruction. Il faut retirer le nombre d'octets des deux premières instructions.
Pour ça, il faut que tu les traduises en langage machine, soit manuellement - on a bien dû te donner une liste des instructions du processeur avec leur codage - soit avec un assembleur.
Question 2 : Il faut faire la même chose, mais en allant vers la fin du programme au lieu de remonter au début.
Question 3 : En faisant l'assemblage du programme pour les deux premières questions, tu auras déterminé les codes de toutes les instructions. Et tu sais que la troisième commence à CS:IP = 1492:0005. En fait, tu as déjà dû remplir ce tableau pour répondre aux deux premières questions.
Pour les données, il n'y en a qu'une, on peut légitimement supposer qu'elle est à l'offset 0, et le segment t'est donné dans l'un des registres avec l'image du debug.
Caliphe
Messages postés
31
Date d'inscription
dimanche 3 mai 2015
Statut
Membre
Dernière intervention
24 février 2016
21 juin 2015 à 19:02
21 juin 2015 à 19:02
Up svp !
Utilisateur anonyme
22 juin 2015 à 15:06
22 juin 2015 à 15:06
Pour la deuxième colonne, ce n'est pas la taille qui t'est demandée : elle est toujours de un octet puisqu'on te demande "pour chaque adresse".
Si tu peux utiliser debug, tu peux utiliser la commande "A" pour assembler ton programme et voir ainsi quels sont les codes générés. Attention, la commande A de debug ne connaît pas les symboles comme "boucle" ou "tempo", ce sera à toi de fournir les adresses.
Pour les remarques de shaynox, s'il a raison sur le fond, ce n'est clairement pas l'esprit du travail qui t'est demandé.
Si tu peux utiliser debug, tu peux utiliser la commande "A" pour assembler ton programme et voir ainsi quels sont les codes générés. Attention, la commande A de debug ne connaît pas les symboles comme "boucle" ou "tempo", ce sera à toi de fournir les adresses.
Pour les remarques de shaynox, s'il a raison sur le fond, ce n'est clairement pas l'esprit du travail qui t'est demandé.
Caliphe
Messages postés
31
Date d'inscription
dimanche 3 mai 2015
Statut
Membre
Dernière intervention
24 février 2016
22 juin 2015 à 20:02
22 juin 2015 à 20:02
Effectivement, ce n'est pas l'esprit du travail mais cette information m'aide à mieux comprendre donc merci shaynox !
Par contre, je ne peux pas utiliser le debug, les seuls infos dont je dispose sont celles que j'ai écrites et un extrait du jeu d'instructions de la famille x86.
par exemple voici une ligne du tableau :
Opération | Code Opération | Nombre de top d'horloge ou micro-cycle
mov ax, [adresse] | A1 | 10
Encore merci de votre aide !
Par contre, je ne peux pas utiliser le debug, les seuls infos dont je dispose sont celles que j'ai écrites et un extrait du jeu d'instructions de la famille x86.
par exemple voici une ligne du tableau :
Opération | Code Opération | Nombre de top d'horloge ou micro-cycle
mov ax, [adresse] | A1 | 10
Encore merci de votre aide !
Utilisateur anonyme
>
Caliphe
Messages postés
31
Date d'inscription
dimanche 3 mai 2015
Statut
Membre
Dernière intervention
24 février 2016
Modifié par shaynox le 22/06/2015 à 20:07
Modifié par shaynox le 22/06/2015 à 20:07
Np ^^
Étant donné que tu utilises clairement l'arch intel, plus simple de lire leurs documentations (volumes 2A 2B 2C pour toi): https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html
Et ce que tu fait n'est pas du x86 (32-bits), mais du 16-bits.
Étant donné que tu utilises clairement l'arch intel, plus simple de lire leurs documentations (volumes 2A 2B 2C pour toi): https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html
Et ce que tu fait n'est pas du x86 (32-bits), mais du 16-bits.
Caliphe
Messages postés
31
Date d'inscription
dimanche 3 mai 2015
Statut
Membre
Dernière intervention
24 février 2016
23 juin 2015 à 17:27
23 juin 2015 à 17:27
Merci à vous, je passe le sujet en résolu ;)
22 juin 2015 à 11:51
22 juin 2015 à 11:58
Modifié par shaynox le 22/06/2015 à 12:14
"À quelle adresse physique commence le programme ?"
Impossible de savoir sachant que tu développes sur un OS gérant la pagination: adresse virtuelle (plusieurs mêmes adresses de même valeur virtuelle, mais pas physique).
"À quelle adresse physique finit le programme ? "
Idem, impossible de savoir, a moins de regarder dans la RAM via un éditeur hexadecimal comme https://mh-nexus.de/en/hxd/, par contre je ne sais pas si c'est possible de trouver son programme, trop long, et tu as des zones que tu ne peux voir (protégée en lecture)
"Question 3:"
https://www.developpez.net/forums/d1519012/autres-langages/assembleur/x86-16-bits/fonction-entrer-entier/#post8243702
22 juin 2015 à 13:52
Tu dis que c'est impossible d'avoir l'adresse physique au commencement et à la fin du programme mais "le père" a montré une solution qui je pense est bonne car ces questions viennent d'un examen et cela m'étonnerait que les correcteurs attendaient la réponse "impossible de savoir", enfin je vais essayer de comprendre un peu plus ce que tu proposes :)
Modifié par shaynox le 22/06/2015 à 17:10
https://stackoverflow.com/questions/22290347/understanding-virtual-address-virtual-memory-and-paging
https://wiki.osdev.org/Paging
https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf (chaptire 4 Paging)
Donc à moins que tu développes sur un OS non multitâches (DOS), tu peux effectivement trouver l'emplacement physique de ton programme en RAM, par l'equation: segment * 0x10 + offset
À moins que tes profs se soient trompés et ont voulu dire l'adresse virtuelle de ton programme, ne pas confondre les termes techniques en assembleur :p
On doit tout prendre en compte quand on développe sur ce langage, rien ne doit être laissé au hasard, c'est ce qui fait la qualité d'un bon programmeur en assembleur.
La place à l'abstraction n'a plus lieu d'être ^^