Что делает директива ORG в ассемблерном коде?
Вопрос
Для справки, этот код предназначен для motorola 68008.
Допустим, у меня есть такой код, как следующий:
org 200
sequenceO: ds.b 5
sequenceN: ds.b 5
move.w #sequenceO, A0
move.w #sequenceN, A1
Прав ли я, полагая, что A0 будет содержать значение 200, а A1 - значение 205?
Один из экзаменационных вопросов в прошлой работе был:"Каковы физические адреса sequence0 и sequenceN?", будет ли ответ "200 и 205", или это будет "200-204 и 205-209"?
Я видел несколько фрагментов кода с несколькими директивами org, например;
организация 100
массив1:ds.b 4
орг 300
Прав ли я, думая, что соблюдается последняя директива org, например, в этом случае array1 указывает на 300?
Решение
- Да, это звучит правильно.Адрес
sequenceN
находится на 5 байт дальшеsequence0
. - "Это зависит", я думаю ...Поскольку это "адреса" во множественном числе, я предполагаю, что они хотели получить весь диапазон, и в этом случае ваш последний ответ верен.
- Нет, я бы ожидал нескольких
org
s просто применить к коду, следующему за ними, так что в этом случаеarray1
было бы по цене 100 долларов.Поскольку после последнего не происходит генерации кода или данныхorg
, это в основном игнорируется ассемблером.
Другие советы
Я предполагаю, что "ORG" означает "источник" - первый адрес, который должен быть присвоен передаваемому коду или сегменту данных.
Да, 200 и 205
Sequence0 начинается с 200 и расширяется на 5 байт до 204
Нет, array1 начинается со 100, все, что после org 300, будет начинаться с 300
Ты используешь: MOVE.W #sequenceO, A0
Таким образом, вы загружаете только младшее слово (16 бит) адреса в A0
.Это будет работать только при очень низком объеме памяти ( A0
под $00010000
)
В общем случае, используя MOVE.W
в регистре адресов становится сложнее.
Попробуй: LEA #sequence0, A0
(загружает 32-разрядный адрес в A0
)
Большинство ассемблеров также будут делать:
MOVEA.L #sequence0, A0
Спасибо, Дэйв Смолл