2009-05-26 9 views
1

Pour référence, le code est pour le motorola 68008.Que fait la directive ORG dans le code d'assemblage?

Dire que j'ai un code tel que:

org 200 
sequenceO: ds.b 5 
sequenceN: ds.b 5 

move.w #sequenceO, A0 
move.w #sequenceN, A1 
  1. Ai-je raison de penser que A0 tiendra la valeur 200 et A1 la valeur 205? L'une des questions d'examen dans un article précédent était: «Quelles sont les adresses physiques de sequence0 et sequenceN?», La réponse serait-elle «200 et 205», ou serait-ce «200-204 et 205- 209 "?

  2. J'ai vu quelques morceaux de code avec plusieurs directives org, par exemple;

    org 100

    array1: ds.b 4

    org 300

Ai-je raison de penser que la dernière directive org est suivie, par exemple, dans ce cas, les points de Array1 à 300?

Répondre

2
  1. Oui, cela semble correct. L'adresse de sequenceN est de 5 octets au-delà de sequence0.
  2. "Cela dépend", je suppose ... Comme c'est "adresses" au pluriel, je suppose qu'ils voulaient toute la gamme, auquel cas votre dernière réponse est correcte.
  3. Non, je m'attendrais à ce que plusieurs org s s'appliquent simplement au code qui les suit, alors dans ce cas le array1 serait à 100 $. Comme aucune génération de code ou de données ne se produit après ce dernier org, il est fondamentalement ignoré par l'assembleur.
2

Je suppose que "ORG" signifie "origine" - la première adresse à attribuer au code ou au segment de données émis.

+0

Ce WAS ce que je supposais aussi bien. Cependant, je n'ai pas pu trouver de détails dans mes notes de cours ou sur Internet, et je veux m'assurer que j'ai bien compris comment cela fonctionne. Je ne veux pas faire une erreur stupide dans l'examen où je suppose que le SequenceO pointe à 200 quand il pointe à 201. –

+0

Et que signifie "directive d'organisation" @dmor? –

1
  1. Oui, 200 et 205

  2. Sequence0 commence à 200 et étend sur 5 octets à 204

  3. Non, array1 commence à 100, quoi que ce soit après l'org 300 commencerait à 300

1

Vous utilisez: MOVE.W #sequenceO, A0

Ainsi, vous ne chargez que le mot inférieur (16 bits) de l'adresse dans A0. Ça ne fonctionnera que dans une très faible mémoire (A0 sous $00010000)

En général utilisant un MOVE.W sur un registre d'adresse devient délicat.

Essayez: LEA #sequence0, A0 (charge une adresse de 32 bits en A0)

La plupart des assembleurs feront également:

MOVEA.L #sequence0, A0 

Merci, Dave Petit