Что находится в стеке 68000, когда в программу входит классический MacOS?
Я пытаюсь понять точку входа старого классического приложения Mac. Я разобрал первый ресурс CODE (не CODE#0, который является таблицей переходов). Код ссылается на некоторые переменные вне стека: слово в 0004(A7), массив длинных слов, начинающихся в 000C(A7), длина которых является значением в 0004(A7), и последнее длинное слово после этого массива, которое кажется указателем на строку символов.
Массив длинных слов на первый взгляд выглядит как строки, поэтому внешне он выглядит так, как будто мы имеем дело с (int argc, char ** argv) ситуацией, за исключением того, что массив "argv" встроен в кадр стека.
Чего ожидать программе от своего стека / регистров, когда она впервые вызывается Mac OS?
2 ответа
По памяти я не думаю, что в стеке есть что-то интересное, когда ваш ресурс CODE впервые вызывается. Классическая Mac OS не использовала argc/argv. Хотя прошло много времени, поэтому я могу ошибаться, и несколько лет назад я выкинул все свои старые тома Inside Mac, так что я не могу легко проверить.
Я не знаю, имеет ли это какое-либо значение (я только посмотрел на этот вопрос, потому что в заголовке было 68000...!), Но вы, кажется, здесь найдете информацию о разработке Mac:
http://developer.apple.com/legacy/mac/library/documentation/macos8/mac8.html
(Гипотеза: argv
данные вполне могут быть в стеке. Очевидный способ разбить командную строку на части - начать с конца, а не с начала. Пройдите командную строку назад (используя -(An)
режим адресации) и найти куски таким образом. Это потенциально немного усложняет ситуацию, но 68000 может сравнивать непосредственные значения с памятью, так что нет проблем с поиском \ и тому подобного (если Mac OS делает это). Как только начало фрагмента найдено, поместите его адрес в стек - вероятно, у вас есть удобный старт (из-за предварительной обработки), но PEA
сделает это легко в любом случае - и вставит 0 в его конец, чтобы завершить его. После того, как все указатели были нажаты, загрузчик может сделать MOVEA.L A7,-(A7)
или же PEA A7
подтолкнуть argv
указатель.
(Это, вероятно, сработало бы неплохо, если бы вы его закодировали, и поэтому меня не удивило бы, если бы этот подход был действительно принят.)