gpt4 book ai didi

amiga - Amiga 500 上的堆栈边界检查

转载 作者:行者123 更新时间:2023-12-04 10:06:13 24 4
gpt4 key购买 nike

我有一个 68000 汇编语言程序在我的 Commodore Amiga 500 上运行,它可能会使用大量堆栈空间,所以我想进行边界检查。

如果我调用 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 堆栈中可能具有的其他一些数据?

最佳答案

在重新(…)阅读手册之后,我可能已经明白了。

来自 Amiga ROM 内核引用手册:库和设备,第 584 页:

The CLI does not create a new process for a program; it jumps to the program's code and the program shares the process with the CLI.

据此,我了解到 FindTask(NULL) 返回的进程是 CLI 进程,而 tc_SPUpper 和 tc_SPLower 指的是该进程的堆栈。

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

When the CLI starts up a program, it allocates a stack for that program. This stack is initially 4000 bytes, but you may change the stack size with the STACK command. AmigaDOS obtains this stack from the general free memory heap just before you run the program; it is not, however, the same as the stack that the CLI uses.

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

同样来自 AmigaDOS 开发者手册,p. 160:

AmigaDOS pushes a suitable return address onto the stack that tells the CLI to regain control and unload your program. Below this on the stack at 4(SP) is the size of the stack in bytes…

据此,我得出结论,对于从 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 页:

When a user activates a tool or project, Workbench runs a program. This program is a separate process and runs asynchronously to Workbench.

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

关于amiga - Amiga 500 上的堆栈边界检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61578536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com