[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
Bonjour,
tout d'abord je tiens à préciser que cela fait plusieurs jours que je cherche la solution et que je ne trouve rien.
Voici mon problème :
-Programme :
section .text
global main
main :
mov ax, data
mov ds, ax
mov ax, [tempo]
boucle : dec ax
cmp ax, 0
jne boucle
mov ah, 4ch
int 21h
section .data
tempo : db 20


Debug avant l'execution de la troisième instruction (mov ax, [tempo])

AX=1494 BX=FFFF CX=FF72 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=1494 ES=1482 SS=1492 CS=1492 IP=0005


Question 1:
A quelle adresse physique commence le programme ?
-D'après ce que j'ai lu il suffit de prendre le segment CS et l'offset IP et faire la formule : segment * 16 + offset donc l'adresse physique au commencement serait
14925.

Question 2:
A quelle adresse physique finit le programme ?
-Là je n'ai rien trouvé :/

Question 3:
Il faut remplir un tableau de deux colonnes (Adresse logique et Mémoire) des adresses logiques de chaques case mémoire sous la forme adresse : offset ainsi que le contenu de la mémoire qui contient le programme et les données (en nous aidant du debug)
-Là aussi je n'ai rien trouvé.

Je n'ai évidemment besoin que de la méthode et pas des réponses sinon cela ne me servirait à rien ;)


J'ai besoin d'aide svp
Merci à vous ! :)

3 réponses

Utilisateur anonyme
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.
1
Caliphe Messages postés 31 Date d'inscription dimanche 3 mai 2015 Statut Membre Dernière intervention 24 février 2016
22 juin 2015 à 11:51
Merci beaucoup ! C'est exactement ce que je voulais savoir :)
0
Caliphe Messages postés 31 Date d'inscription dimanche 3 mai 2015 Statut Membre Dernière intervention 24 février 2016
22 juin 2015 à 11:58
Pour le contenu dans la deuxième colonne il faut donner la taille donc ?
0
Salut,

"À 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
0
Caliphe Messages postés 31 Date d'inscription dimanche 3 mai 2015 Statut Membre Dernière intervention 24 février 2016
22 juin 2015 à 13:52
Salut et merci aussi d'avoir répondu :)
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 :)
0
Re désolé, pas reçu de notification, donc oui c'est impossible, car quel est ton OS ? Windows 32/64 bit ? donc oui c'est pas possible.

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 ^^
0
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
Up svp !
0
Utilisateur anonyme
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é.
0
Surement, mais c'est important de ne pas confondre les termes techniques en assembleur (je parle des prof qui ont donné ce devoir ^^)
0
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
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 !
0
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
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.
0
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
Merci à vous, je passe le sujet en résolu ;)
0