4 votes

Comment déterminer le résultat en AX après les instructions MOV et LEA ?

J'essaie de comprendre quel sera le contenu de l'étude. AX dans la question suivante, je ne comprends pas comment je peux savoir ce qu'est [5000h] ou [DI] dans les exemples.

L'état des registres et de la mémoire est défini comme suit :

CS=3000 [53000]=BBBB [33000]=6666 [13000]=1111
DS=1000 [54000]=CCCC [34000]=7777 [14000]=2222
SS=5000 [55000]=DDDD [35000]=8888 [15000]=3333
DI=7000 [56000]=EEEE [36000]=9999 [16000]=4444
BP=4000 [57000]=FFFF [37000]=AAAA [17000]=5555

Quelle est la valeur en AX de chacune de ces instructions ?

  • MOV AX, [DI]
  • MOV AX, [5000h]
  • MOV AX, [BP+2000h]
  • LEA AX, [BP+1000h]

7voto

Michael Petch Points 24066

Il s'agit d'une question académique, mais elle touche à un certain nombre de concepts du mode réel Adressage segment:offset 20 bits . Toutes les adresses mémoire en mode réel sont toujours composées de deux parties : un segment et un décalage. Ces deux parties sont combinées pour générer une adresse physique selon la formule suivante :

Physical Address = segment * 16 + offset

ou

Physical Address = segment << 4 + offset

Les deux donnent le même résultat, car décaler quelque chose de 4 bits vers la gauche revient à multiplier par 16 en décimal (ou 10h en hexadécimal).

Vous constaterez que les instructions peuvent spécifier un segment de manière explicite et que, lorsqu'il n'est pas spécifié, il existe toujours un segment implicite. La règle générale est que si une adresse mémoire utilise le segment BP alors l'opérande mémoire est relatif à la SS sinon il est relatif au segment DS segment.

Un LEA n'accède pas réellement à la mémoire physique, elle calcule simplement l'adresse effective de l'opérande mémoire et charge l'adresse dans un registre. Avec LEA le segment n'entre pas en ligne de compte. A MOV avec un opérande de mémoire déplacera le contenu d'un opérande de mémoire vers/depuis un registre.


Toutes les valeurs indiquées dans vos questions sont données en hexadécimal. Pour répondre à vos questions :

  • MOV AX, [DI] est identique à MOV AX, [DS:DI] puisque le segment implicite est DS . Dans la question DS \=1000h. DI \=7000h . Le décalage est de DI . En utilisant la formule segment<<4 + offset nous obtenons l'adresse physique 1000h<<4+7000h = 10000h+7000h=17000h. La question indique l'adresse mémoire [17000]=5555 la valeur déplacée dans AX est donc 5555h.

  • MOV AX, [5000h] est identique à MOV AX, [DS:5000h] puisque le segment implicite est DS . Dans la question DS \=1000h. Le décalage est de 5000h . En utilisant la formule segment<<4 + offset nous obtenons l'adresse physique 1000h<<4+5000h = 10000h+5000h=15000h. La question indique l'adresse mémoire [15000]=3333 la valeur déplacée dans AX est donc 3333h.

  • MOV AX, [BP+2000h] est identique à MOV AX, [SS:BP+2000h] puisque le segment implicite est SS . Dans la question SS \=5000h et BP \=4000h. Le décalage est de BP +2000h . En utilisant la formule segment<<4 + offset nous obtenons l'adresse physique 5000h<<4+(4000h+2000h) = 50000h+(4000h+2000h)=56000h. La question indique l'adresse mémoire [56000]=EEEE la valeur déplacée dans AX est donc EEEEh.

  • LEA AX, [BP+1000h] : Le segment n'entre pas en ligne de compte puisqu'il s'agit d'une LEA l'instruction. Dans la question BP \=4000h. Le décalage est de BP +1000h=4000h+1000h = 5000h. Puisque LEA ne fait que calculer et stocker l'adresse dans un registre la valeur en AX sera de 5000h.

2voto

thb Points 4370

[Ma réponse est laissée ici à titre de référence, mais je la retire. D'après les informations que vous avez fournies, j'en déduis que votre processeur x86 fonctionne en mode de compatibilité 8086 privilégié, comme lors du chargement de l'amorçage. Je n'ai malheureusement aucune expérience en matière d'écriture de chargeurs de démarrage].

Les anciennes données d'un registre sont écrasé lorsque de nouvelles données arrivent. Par conséquent, seule l'instruction LEA affecte ce résultat.

De plus, l'instruction LEA est particulière : elle ne déréférence pas l'adresse qu'elle calcule. Dans votre exemple, comme BP contient 4000h, l'adresse calculée par LEA est 4000h + 1000h == 5000h. La dernière adresse n'est pas utilisé, mais il est simplement stocké dans le registre AX en vue d'une utilisation ultérieure.

Par conséquent, à la fin de l'exécution de ce code, le registre AX contiendra la valeur 5000h.

Pour clarifier, je n'ai pas dit que le registre AX contiendrait une copie de la donnée stockée dans la mémoire à l'adresse 5000h. J'ai plutôt dit quelque chose de plus simple : le registre AX contiendra la valeur 5000h.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X