Was bewirkt die ORG-Direktive im Assembler-Code?
Frage
Als Referenz gilt der Code für das Motorola 68008.
Angenommen, ich habe Code wie den folgenden:
org 200
sequenceO: ds.b 5
sequenceN: ds.b 5
move.w #sequenceO, A0
move.w #sequenceN, A1
Liege ich richtig, wenn ich denke, dass A0 den Wert 200 und A1 den Wert 205 haben wird?
Eine der Prüfungsfragen in einer früheren Arbeit war:„Wie lauten die physikalischen Adressen von Sequenz0 und SequenzN?“ Wäre die Antwort „200 und 205“ oder „200-204 und 205-209“?
Ich habe ein paar Codeteile mit mehreren Org-Anweisungen gesehen, z. B.;
org 100
array1:ds.b 4
org 300
Habe ich recht, wenn ich denke, dass die letzte org-Anweisung befolgt wird, z. B. zeigt array1 in diesem Fall auf 300?
Lösung
- Ja, das klingt richtig.Die Adresse von
sequenceN
liegt 5 Byte darüber hinaussequence0
. - „Das kommt darauf an“, schätze ich ...Da es sich um „Adressen“ im Plural handelt, wollten sie vermutlich den gesamten Bereich. In diesem Fall ist Ihre letzte Antwort richtig.
- Nein, ich würde mehrere erwarten
org
s soll nur auf den darauf folgenden Code angewendet werden, also in diesem Fall diearray1
würde bei 100 $ liegen.Da danach keine Code- oder Datengenerierung erfolgtorg
, wird es vom Assembler grundsätzlich ignoriert.
Andere Tipps
Ich gehe davon aus, dass „ORG“ bedeutet „origin.“ - die erste Adresse an dem Code- oder Datensegment zugeordnet wird, emittiert wird
-
Ja, 200 und 205
-
Sequence0 beginnt bei 200 und erstreckt sich über 5 bis 204 Byte
-
Nein, array1 bei 100 beginnt, alles nach dem org 300 würde bei 300 beginnen
Sie verwenden: MOVE.W #sequenceO, A0
Also, Sie laden nur das untere Wort (16 Bit) der Adresse in A0
.
Das wird nur sehr wenig Speicher arbeitet in (A0
unter $00010000
)
In der Regel eine MOVE.W
auf einem Adressenregister mit wird schwierig.
Versuchen: LEA #sequence0, A0
(lädt eine 32-Bit-Adresse in A0
)
Die meisten Monteure werden auch tun:
MOVEA.L #sequence0, A0
Danke, Dave Klein