簡體   English   中英

Amiga 500 的堆棧邊界檢查

[英]Stack bounds checking on the Amiga 500

我在 Commodore Amiga 500 上運行了一個 68000 匯編語言程序,它可能會使用大量堆棧空間,所以我想做邊界檢查。

如果我調用 FindTask(NULL),並檢查 tc_SPUpper 和 tc_SPLower,我會得到 $c22c24 和 $c21fa4,它們是 3200 字節的堆棧; 但是,CLI 分配了 8000 字節的堆棧,並且程序以 $c29598 的堆棧指針開始——在 memory 中比 tc_SPUpper 大約高 26K。

我在 AmigaDOS 開發人員手冊中讀到,在啟動時,4(sp) 包含堆棧大小。 該值確實包含 8000。(“在 4(SP) 的堆棧上低於此值是堆棧的大小(以字節為單位,如果您希望執行堆棧檢查,這可能很有用。”)

我可以安全地將 sp - 4(sp) 作為堆棧的下限嗎? 我是否需要考慮堆棧大小、返回地址和 CLI 可能在堆棧上的一些其他數據?

在重新(……)閱讀手冊之后,我可能已經明白了。

來自Amiga ROM Kernel 參考手冊:庫和設備,第 584 頁:

CLI 不會為程序創建新進程; 它跳轉到程序的代碼,程序與 CLI 共享進程。

由此,我推測 FindTask(NULL) 返回的進程是 CLI 進程,而 tc_SPUpper 和 tc_SPLower 指的是該進程的堆棧。

來自AmigaDOS 開發者手冊,p. 160:

當 CLI 啟動一個程序時,它會為該程序分配一個堆棧。 此堆棧最初為 4000 字節,但您可以使用 STACK 命令更改堆棧大小。 AmigaDOS 在您運行程序之前從通用的免費 memory 堆中獲取此堆棧; 但是,它與 CLI 使用的堆棧不同。

由此,我得出結論,我的程序堆棧與 FindTask(NULL) 返回的任務中的堆棧是分開的。

也來自AmigaDOS 開發者手冊,第 1 頁。 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 Kernel 參考手冊:庫和設備,第 584 頁:

當用戶激活工具或項目時,Workbench 會運行程序。 該程序是一個單獨的進程,並且與 Workbench 異步運行。

我已經確認這兩個值之間的差異確實是 .info 文件中指定的堆棧大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM