После повторного (...) чтения руководств я, возможно, понял это.
С Справочное руководство по ядру ПЗУ 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 .