首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Amiga 500上的堆栈边界检查

Amiga 500上的堆栈边界检查
EN

Stack Overflow用户
提问于 2020-05-04 01:10:02
回答 1查看 115关注 0票数 2

我有一个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可能在堆栈上包含的其他一些数据?

EN

回答 1

Stack Overflow用户

发布于 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运行的程序,以下代码将为我提供堆栈上可用的最低地址。

代码语言:javascript
复制
        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文件中指定的堆栈大小。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61578536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档