簡體   English   中英

我應該如何使用自定義編譯器管理內存?

[英]How should I manage memory with my custom compiler?

我正在為Java 8位處理器創建一個模擬器。 它的架構非常簡單,只有一個4字節的寄存器和256字節的主存儲器。 我已經實現了“硬件”堆棧,因此處理器支持PUSHPOPGET 堆棧從最后一個存儲單元向后填充,因此“正常”的內存使用應從單元0開始。您不必保留內存,該程序默認可以使用完整的256字節。

我還正在為此處理器創建一個編譯器,該編譯器可以使用我發明的簡單語言進行編譯。 目前,每個定義的變量(我只支持一種8位整數類型)都分配給一個存儲單元,從0開始並遞增。 所以我最多有256個(如果堆棧為空)變量。 目前,我不想更改此設置。

我的下一個目標是增加使用無返回值類型的無參數過程的能力。 在自動返回之前,應釋放函數中聲明的變量。 那么我應該在哪里存儲變量? 我將在內存的開頭和變量的末尾之間創建一個“軟件”堆棧。 首先,我想到了使用硬件堆棧的想法,但我想將其用於方法本身的調用和返回。 有沒有比創建第二個“軟件”堆棧更好的解決方案?

每個函數在調用時都應在堆棧上創建一個激活框架/調用堆棧,其中包括用於返回地址,任何參數以及在函數內創建的任何局部變量的空間。 至少在您所處的情況下,激活框架應包含調用代碼的返回地址。 發揮作用的額外數據取決於您的函數是否接受參數,和/或是否創建了該函數本地的任何變量。 您的堆棧可能如下所示:

+------------------+
|  Return address  |
+------------------+
|   Parameter 0    |
+------------------+
|       ...        |
+------------------+
|   Parameter N    |
+------------------+
|   Local Var 0    |
+------------------+
|       ...        |
+------------------+
|   Local Var N    |   <--- Top of Stack
+------------------+

由於您已經將主存儲器用於堆棧,因此激活框架也將存在於此。 我假設您的處理器具有指向堆棧頂部的堆棧指針?

可以創建兩個堆棧,但隨后需要確定將堆棧放置在何處以及應消耗多少內存。 您是否要將一半的​​主內存用於硬件堆棧,而另一半用於軟件堆棧? 這也意味着您限制了可以進行的嵌套調用(甚至遞歸)調用的數量。 而是有另一種方法可以用來節省內存使用量。 這樣做的方法是在調用函數之后將參數包含到函數中(您的匯編器將必須執行此操作):

+--------------+
|   JMP FUNC   | Call the function
+--------------+
|  Parameter 0 | <--- return address points here
+--------------+
|     ...      |
+--------------+
|  Parameter N |
+--------------+
| (other code) | <--- after function call, return address should be fixed to point here
+--------------+

這意味着您將需要在函數內部做更多的工作來加載參數。 如果您還記得,返回地址是堆棧上的第一個值。 您可以加載該值,然后索引該值以加載參數。 加載完參數后,您需要調整返回地址的值,以使其指向您定義的參數之后開始的代碼。

保留兩個堆棧肯定會很好,但是隨后您就不得不決定將兩個堆棧放置在何處。 硬件應該從255開始,軟件從127開始嗎? 這將使您的有效內存空間減少了一半,並且遞歸深度也減少了一半,因為最多只有127個插槽可以放入函數調用。

交錯堆棧-硬件為255,軟件為254,隨后的每個值跳2個點可解決內存范圍的損失,但是如果/當堆棧不平衡時,您仍然在浪費內存(10個排隊的硬件堆棧插槽,使用了20個軟件插槽=浪費了10個插槽),並且無論如何也將堆棧尋址空間減少了一半

可能有幾種有效的解決方案。 您可以在“硬件”堆棧中為調用/返回數據分配變量,也可以為“內存”實現類似堆棧的方案,以便在調用時存儲“內存頂部”並在返回時彈出。 毫無疑問,還有2或3個其他方案。

要考慮的一件事是如何處理“本地”數據與“全局”數據。 您可能需要添加新的“本地尋址”操作碼或某種基本寄存器方案。

您可能想研究一下舊Burroughs機器是如何完成的。

暫無
暫無

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

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