Проверка границ стека на Amiga 500 - PullRequest
1 голос
/ 03 мая 2020

У меня на Commodore Amiga 500 работает программа на языке ассемблера 68000, которая потенциально может использовать много места в стеке, поэтому я хочу выполнить проверку границ.

Если я вызываю FindTask (NULL) и проверяю tc_SPUpper и tc_SPLower, я получаю $ c22c24 и $ c21fa4, что составляет 3200 байт стека; однако для CLI выделено 8000 байт стека, и программа запускается с указателем стека $ c29598 - примерно на 26 КБ больше памяти, чем tc_SPUpper.

Я прочитал в Руководстве разработчика AmigaDOS, что при запуске 4 (sp) содержит размер стека. Это значение содержит 8000. («Ниже стека в 4 (SP) указан размер стека в байтах, что может быть полезно, если вы хотите sh выполнить проверку стека.»)

Могу ли я безопасно принять sp - 4 (sp) в качестве нижнего предела стека? Нужно ли учитывать размер стека, адрес возврата и некоторые другие данные, которые CLI может иметь в стеке?

1 Ответ

1 голос
/ 04 мая 2020

После повторного (...) чтения руководств я, возможно, понял это.

С Справочное руководство по ядру ПЗУ Amiga: Библиотеки и устройства , с.584:

CLI не создает новый процесс для программы; он переходит к коду программы, и программа делит процесс с CLI.

Из этого я понимаю, что процесс, возвращаемый FindTask (NULL), является процессом CLI, а tc_SPUpper и tc_SPLower ссылаются на стек для этого процесса.

Из Руководство разработчика AmigaDOS , с. 160:

Когда CLI запускает программу, он выделяет стек для этой программы. Этот стек изначально составляет 4000 байтов, но вы можете изменить размер стека с помощью команды STACK. AmigaDOS получает этот стек из общей кучи свободной памяти непосредственно перед запуском программы; однако это не то же самое, что стек, который использует CLI.

Из этого я заключаю, что мой программный стек отделен от стека в задаче, возвращаемой FindTask (NULL).

Также из Руководство разработчика AmigaDOS , с. 160:

AmigaDOS помещает подходящий адрес возврата в стек, который говорит CLI восстановить управление и выгрузить вашу программу. Ниже этого в стеке в 4 (SP) размер стека в байтах…

Из этого я заключаю, что для программ, запускаемых из CLI, следующий код даст мне самый низкий адрес, доступный в стеке.

        move.l  sp,d0               ; current stack pointer
        addq.l  #8,d0               ; return address and stack size
        sub.l   4(sp),d0            ; size of stack
        move.l  d0,stack_lowest     ; save for stack checking

Для программ, запускаемых из Workbench, я думаю, что значения tc_SPUpper и tc_SPLower - это те значения, которые мне нужны.

С Справочное руководство по ядру ROM Amiga: Библиотеки & Устройства , стр.584:

Когда пользователь активирует инструмент или проект, Workbench запускает программу. Эта программа представляет собой отдельный процесс и работает асинхронно с Workbench.

Я подтвердил, что разница между этими двумя значениями действительно равна размеру стека, указанному в файле .info .

...