我有一个68000汇编语言程序运行在我的Commodore Amiga500上,它可能会使用大量的堆栈空间,所以我想做边界检查。
如果我调用FindTask(NULL),并检查tc_SPUpper和tc_SPLower,我会得到$c22c24和$c21fa4,这是3200字节的堆栈;但是,CLI分配了8000字节的堆栈,并且程序开始时的堆栈指针为$c29598-在内存中比tc_SPUpper高出大约26K。
我在AmigaDOS开发人员手册中读到,开始时,4(sp)包含堆栈大小。该值包含8000。(“在堆栈4(SP)的下面是以字节为单位的堆栈大小,如果要执行堆栈检查,这可能很有用。”)
我可以安全地将sp - 4(sp)作为堆栈的下限吗?我是否需要考虑到堆栈大小、返回地址以及CLI可能在堆栈上包含的其他一些数据?
发布于 2020-05-05 04:14:38
re-re-(…)之后-reading手册,我可能已经弄明白了。
摘自《Amiga ROM内核参考手册:库和设备》,第584页:
命令行界面并不为程序创建新的进程;它跳转到程序的代码,程序与命令行界面共享该进程。
由此,我推断FindTask(NULL)返回的进程是CLI进程,而tc_SPUpper和tc_SPLower指的是该进程的堆栈。
摘自AmigaDOS开发人员手册,第160页:
当命令行界面启动程序时,它会为该程序分配一个堆栈。此堆栈最初为4000字节,但您可以使用stack命令更改堆栈大小。就在您运行程序之前,AmigaDOS从一般的空闲内存堆获取此堆栈;但是,它与CLI使用的堆栈不同。
由此,我得出结论,我的程序栈与FindTask(NULL)返回的任务中的栈是分开的。
也摘自AmigaDOS开发人员手册,第160页:
AmigaDOS会将合适的返回地址推送到堆栈上,告诉它重新获得控制权并卸载您的程序。在堆栈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对于从工作台启动的程序,我认为tc_SPUpper和tc_SPLower是我想要的值。
摘自《Amiga ROM内核参考手册:库和设备》,第584页:
当用户激活工具或项目时,工作台将运行程序。此程序是一个单独的进程,并与Workbench异步运行。
我已经确认这两个值之间的差异确实是.info文件中指定的堆栈大小。
https://stackoverflow.com/questions/61578536
复制相似问题