在Amiga 500上检查堆栈边界

时间:2020-05-03 17:10:02

标签: amiga

我在Commodore Amiga 500上运行了68000汇编语言程序,该程序可能会占用大量堆栈空间,因此我想进行边界检查。

如果我调用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可能在堆栈中包含的堆栈大小,返回地址和其他一些数据?

1 个答案:

答案 0 :(得分:1)

重新阅读(...)手册后,我可能已经知道了。

摘自 Amiga ROM内核参考手册:库和设备,第584页:

CLI不会为程序创建新进程;它跳到了 程序的代码,并且程序与CLI共享该过程。

由此,我发现FindTask(NULL)返回的进程是CLI进程,并且tc_SPUpper和tc_SPLower引用了该进程的堆栈。

摘自 AmigaDOS开发人员手册,第25页。 160:

CLI启动程序时,会为此分配一个堆栈 程序。该堆栈最初为4000字节,但您可以更改 使用STACK命令的堆栈大小。 AmigaDOS从以下位置获取此堆栈 运行程序之前的常规可用内存堆;它是 但是,与CLI使用的堆栈不同。

由此,我得出结论,我的程序堆栈与FindTask(NULL)返回的任务中的堆栈是分开的。

也来自 AmigaDOS开发人员手册,第9页。 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是我想要的值。

摘自 Amiga ROM内核参考手册:库和设备,第584页:

当用户激活工具或项目时,Workbench将运行一个程序。 该程序是一个独立的过程,并且异步运行以 工作台。

我已经确认这两个值之间的差异确实是.info文件中指定的堆栈大小。