2010-11-28 3 views
1

quelqu'un peut me aider à comprendre les éléments suivants INSTRUCTIONS-opération LEA avec 8086 Assemblée

LES SI,DATA1 
MOV DI,OFFSET DATA2 
MOV BX,[SI] 
MOV CX,[DI] 
MOV[SI],CX 
+2

Si vous avez besoin d'aide pour MOV, vous n'êtes pas prêt pour LEA. Si vous avez besoin d'aide pour LEA voir http://stackoverflow.com/questions/1658294/x86-asm-whats-the-purpose-of-the-lea-instruction –

Répondre

0

correspond au code C suivant:

// DATA1 and DATA2 are 'far' pointers to word of 16 bits, let's say they are 'short' 
short bx = *DATA1; 
*DATA1 = *DATA2; 
// the old value of *DATA1 is still available in the BX register. 
// and the value of *DATA2 is still available in the CX register. 
// also, ES is set to the segment where DATA1 and DATA2 resides. 
+0

um .. je pense que DATA2 n'est pas interprété comme un pointeur (parce que 'OFFSET' est utilisé pour dériver un pointeur dessus) - il devrait juste être une simple variable entière – lijie

0

Vous pouvez simplement rechercher une page d'instructions d'assemblage, et expliquerait ce que chacune de ces instructions fait d'une manière simple à comprendre; à bien des égards, l'assemblage dans sa simplicité basique de base est plus facile à comprendre sur une seule ligne que dans des langages de plus haut niveau.

Je ne peux jamais me rappeler quelle syntaxe d'assemblage x86 commande les choses de cette façon si je ne l'ai pas utilisé depuis longtemps (les deux principales syntaxes d'assemblage x86 ordonnent les opérandes dans l'ordre inverse), donc je ne dirai pas résultat ici.

Pour le premier, je suppose que c'est une faute de frappe et que vous vouliez dire LEA au lieu de LES? LEA est l'abréviation de "load effective address" si je me souviens bien. Son but principal est de calculer l'adresse de mémoire de quelque chose quand vous voulez réellement connaître l'adresse au lieu de simplement utiliser l'adresse.

(edit) Je n'avais pas utilisé de LES auparavant, et Google voulait me rediriger vers LEA, d'où ma déclaration ci-dessus. Je vais laisser ce qui précède si vous pouvez bénéficier de cela aussi. (/ edit)

MOV déplace les données d'un endroit à l'autre. Les opérandes dans les instructions MOV qui sont entourées de [] crochets signifient que vous voulez cette adresse mémoire à la place, donc MOV CX, [DI] serait "déplacer le contenu du registre CX dans l'emplacement mémoire à l'adresse tenue dans le DI register "(ou l'inverse, [DI] dans CX, voir ci-dessus l'ordre des opérandes).

Je ne suis pas sûr sur le "OFFSET DATA2" car je ne me souviens pas d'un mot-clé offset.

1

LES n'est pas LEA. LES x, y interprète y comme un pointeur éloigné et charge ses données dans ES (un registre de segment) et x.

La séquence d'instructions telle que donnée est étrange, car ES n'est pas réellement utilisée.

Quoi qu'il en soit, la séquence d'instructions (si le [SI] sont changées en ES:[SI]) est: étant donné un pointeur loin (DATA1) et une variable (DATA2), déplacer le contenu pointé par DATA1 en BX et les remplacer par ce qui est stocké actuellement à DATA2 (qui sera également dans CX).