Что находится на этих 68 000 стеков, когда классическая MacOS вводит программу?

Я пытаюсь понять старую классическую точку входа приложения Mac. Я демонтировал первый ресурс КОДА (не CODE#0, который является таблицей переходов). Код относится к некоторым переменным от стека: слово в 0004 (A7), массив длинных слов запуска в 000C (A7), чья длина является значением в 0004 (A7) и заключительное длинное слово кроме того, выстраивает, который, кажется, указатель на символьную строку.

Массив длинных слов похож на строки на первый взгляд, таким образом, это смотрит поверхностно как, мы имеем дело с (интервал argc, символ ** argv), ситуация, кроме массива "argv" встроена в стековом фрейме.

Что программа должна ожидать на ее стеке / регистры, когда это сначала назовет Mac OS?

13
задан John Källén 30 April 2010 в 13:24
поделиться

2 ответа

По памяти я не думаю, что при первом вызове вашего ресурса CODE в стеке есть что-нибудь интересное. В классической Mac OS не использовались argc / argv. Это было долгое время, поэтому я мог ошибаться и выбросил все свои старые тома Inside Mac несколько лет назад, так что мне нелегко проверить.

4
ответ дан 2 December 2019 в 01:31
поделиться

Не знаю, будет ли это полезно (я посмотрел на этот вопрос только потому, что в заголовке было написано 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.

(Это, вероятно, будет работать довольно хорошо, если вы это закодируете, и поэтому я не удивлюсь, если именно такой подход будет использован на самом деле)

.
5
ответ дан 2 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: