Директива Easy68k Assembly ORG

Я знаю, что подобные вопросы задавались, но все равно послушайте.

В этом семестре я написал довольно много программ для Easy68k, и мне любопытно, почему директива org всегда установлена ​​на $1000, $2000 или $2500.

Хотя ответ «по личному соглашению», меня больше интересует следующее:

  • Каковы преимущества установки директивы org, ЦП может выполнять что угодно от 0x0 до 0xffffffff, так зачем нужно смещать запуск программы до 0x1000?

Например:

    org $1000
start:
    moveq #9, d0
    trap  #15

    end start

работает, но смещается на 4096 байт вниз

start:
    moveq #9, d0
    trap  #15

    end start

тоже работает, но не компенсируется вообще

Так зачем же нужна эта директива? Я не резервирую [0x0, 0x1000) для какой-либо конкретной цели, так какой смысл сохранять это смещение?

Выводы на данный момент

  • Easy68k не имеет места по умолчанию для глобальных переменных, они помещаются в pc (обычно в конце программы по соглашению).
  • Указатель стека Easy68k по умолчанию находится в 0, увеличивается вниз до 0xffffffe и вниз (выровнено по словам): это означает, что нет конфликта с областью [0, 0x1000). На самом деле, это приведет к повреждению кода до того, как будет повреждена область [0, 0x1000).

Мне очень любопытно.

Спасибо заранее!

~Дмитрий


person Dmitry    schedule 17.03.2013    source источник
comment
Это действительно похоже на соглашение, которое позволяет резервировать стек, параметры командной строки, некоторую глобальную память и т. д. в фиксированных позициях. Я когда-либо писал только несколько строк на ассемблере 68000, поэтому я не могу вспомнить, могло ли некоторое размещение часто используемых переменных и т. д. сделать большинство кодов операций короче. Но это возможно (как нулевая страница в 6502).   -  person Aki Suihkonen    schedule 17.03.2013
comment
Я не верю, что Easy68k имеет какие-либо аргументы командной строки, это симулятор графического интерфейса. Я обратился к глобальной памяти и стеку в своем посте. Кроме того, длина кодов операций на самом деле не имеет значения, но перемещение непосредственного 0x12345678 занимает всего 12 тактов, в то время как перемещение из памяти — 20 тактов, а коды операций — по 6 байт соответственно для немедленного и из памяти: 203c 12345678, 2039 0000001a, что также показывает, что глобальные данные хранятся в конце кода, как память 1a 0000001a точно после моего хода #9, d0; код ловушки № 15, указывающий на симхальт   -  person Dmitry    schedule 17.03.2013


Ответы (1)


Адреса с 0 по примерно $800 зарезервированы для векторов исключений в 68000. $1000 используется в качестве начального адреса по умолчанию, чтобы не попасть в зарезервированную область. Стек по умолчанию находится на вершине памяти и увеличивается до адреса 0.

person Charles Kelly    schedule 07.07.2016
comment
Разве не существовало формулы для определения векторов? Если я правильно помню, они не были от 0 до 800 долларов. Дай мне проверить. Подождите... вы действительно профессор Келли? Извините, я действительно запутался в векторах прерываний, поэтому прошу прощения за спор с создателем программы, мне нравится ваша программа, и я даже пытался посмотреть ее код, хотя это было довольно сложно, так как в прошлый раз она была сделана для borland C. Я проверил. Понимание исключений - одна из самых запутанных частей Easy68k. Это та часть, которую я просто не мог найти в источниках, которые могли бы объяснить это так, как я мог понять. - person Dmitry; 07.07.2016