Forth 内存布局
生活随笔
收集整理的這篇文章主要介紹了
Forth 内存布局
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
FORTH 系統的內存分布圖又可以分為單用戶FORTH和多用戶poly FORTH 那樣的多道程序系統。最簡單的就是單用戶的FORTH系統:
預編譯系統(precompiled ?portion)
????在內存低區駐留著系統唯一的預編譯部分(已經被編譯成詞典形式)。在一些系統中,這種代碼被保存在磁盤上(通常在1~8塊中),當你啟動或“引導”計算機時,他被自動裝配進RAM低區。在另一些系統中,預編譯部分永久駐留在PROM中,只要你一啟動計算機它便可以被使用。 ????預編譯部分通常包括大部分單字長算術運算符和數字格式化詞,單字長棧操作符,編輯命令,轉移和結構控制詞,匯編程序,差不多筆記做到現在遇到過的定義詞。也包括文本和地址解釋程序。
系統變量(System Variables) ????這個區域包含有預編譯部分生成的并可由整個系統使用的“系統變量”。他們一般情況下是不能被用戶使用的。
任選定義(Elective Definitions) ????未被預編譯的FORTH系統部分以源文本形式保存在磁盤上。這是為了更好的控制使用內存空間,可以根據需要決定裝配還是不裝配這些定義中的任何部分。所有“任選定義”的裝配塊稱為“任選快”。比如16塊,16 LOAD?? 可以加載一個小屏面編輯程序。
用戶詞典(User Dictionary) ????在內存中能存貯自己定義的詞的區域稱為“用戶詞典”,詞典區隨著新詞的增加向內存高區生成。詞典中下一個可以用單元總是由變量 DP?指示。在編譯過程中,隨著詞典條目的增加,指針 DP?也逐單元(或逐字節)地調整。因此,DP?是編譯程序的書簽;在詞典中指向的位置是編譯程序下次可編譯的地方。 ????DP?可能被 ALLOT 使用。ALLOT 使DP向前推進給定數量的字節數。系統中有一個詞 HERE 就是用DP實現的 。 DP ( ?--- ?addr ?) ? ?詞典指針變量,它包含詞典中下一個自由存儲地址,他的值可以由HERE給出,也可以由ALLOT更改。 HERE ? ( ? --- ?addr ?) ? 把下一個可用詞典位置的地址留在堆棧頂;(定義里面就用到了上面的指針變量 DP) ? ??? ? ?? ?//HERE 來確定自己寫的程序占用了多少內存空間
高速暫存緩沖區(The Pad) ????詞典中HERE一固定距離有一個小塊叫做“高速暫存緩沖區”它通常用于保存先被操作然后送往終端的 ASCII 碼字符串。例如,在使用 TYPE 之前,數字格式化詞用這個區域來保存轉換過程中的數字的 ASCII 碼。 ????pad的大小沒有限制。在大多數系統中,在pad的起點到參數堆棧棧頂之間有數百個甚至數千個字節。 ????由于pad的起始地址被規定與最后的詞典條目有關,所以每當加入新的定義或執行了 FORGET 或 EMPTY 之后,該起始地址都會發生變化。但是這種安排是安全的。因為當上述時間中的任何一件發生時,pad都不會被用到。詞 PAD 給出了pad的當前起始地址。 ? ? ??? ?//可以看出pad的空間大小是256 (0-255)剛好是一個字節。 PAD ?( ?--- ? addr ?) ? ?留下保存中間處理過程數據的暫存區低地址。PAD的地址或內容可以改變,如果下一個可用詞典單元的地址被改變,則這些數據被舍棄。PAD的容量為84個字符。
參數堆棧(Parameter Stack) ????數據壓入數據堆棧的時候只是棧頂指針的移動;把一個數放入堆棧是,指針先減1,然后數值被存入指針指向的位置。一個數移出堆棧,指針增加1。(堆棧地址是從低到高,數據最先存在在地址高位上,向上增長也是就向著低地址方向增長)。數據堆棧是向下生長(向著地址減小的方向增長) SP@ ? ( ?--- ?addr ?) ? 將堆棧頂地址回送到堆棧頂的與計算機相關過程,所說的堆棧頂的地址是指在執行SP@之前的地址。(取出堆棧頂指針) ? ?? ??//最早放入堆棧中的數據存放在最高位,要想訪問前面的數據就要用當前棧頂元素地址+上偏移量,一個字節包含兩個8位數據,所以偏移一個要+2. 有了這個就可以隨心所欲的訪問堆棧中任意位置的元素。(最好不要在編程中使用) S0 ?( ?--- ?addr ?) ? ?含有“堆棧指針初始值的用戶變量。 SP@ ?( ?--- ?addr ?) ?將堆棧頂地址回送到堆棧頂的與計算機相關過程,所說的堆棧頂的地址是指在執行SP@之前的地址。 棧底由一個 S0 的變量指示。S0 的內容總是“空棧”單元的下一個單元的地址。
輸入信息緩沖區(Input Message Buffer) ????S0 也包含著“輸入信息緩沖區”的起始地址。輸入信息緩沖區向內存高區生成(與pad方向相同)。當從終端輸入文本時,文本便存放在此緩沖區,文本解釋程序將在此緩沖區內掃描文本。
返回堆棧(Return Stack) ????在輸入信息緩沖區的上面是返回堆棧,其操作相同于參數堆棧,但是返回堆棧沒有類似于SP@和S0這樣的高級FORTH詞。
用戶變量區(User Variables) ????返回堆棧上面就是用于存放“用戶變量”的內存區域,這些變量包括 BASE ,S0 ……
塊緩沖區(Block Buffers) ????在高端內存區是若干塊緩沖區。每個緩沖區為一個磁盤塊提供1024個字節空間。當訪問磁盤快的時候(顯示或裝配),系統將該塊從磁盤中復制到緩沖區,在緩沖區能由編輯程序修改該塊或由 LOAD 解釋該塊。
預編譯系統(precompiled ?portion)
????在內存低區駐留著系統唯一的預編譯部分(已經被編譯成詞典形式)。在一些系統中,這種代碼被保存在磁盤上(通常在1~8塊中),當你啟動或“引導”計算機時,他被自動裝配進RAM低區。在另一些系統中,預編譯部分永久駐留在PROM中,只要你一啟動計算機它便可以被使用。 ????預編譯部分通常包括大部分單字長算術運算符和數字格式化詞,單字長棧操作符,編輯命令,轉移和結構控制詞,匯編程序,差不多筆記做到現在遇到過的定義詞。也包括文本和地址解釋程序。
系統變量(System Variables) ????這個區域包含有預編譯部分生成的并可由整個系統使用的“系統變量”。他們一般情況下是不能被用戶使用的。
任選定義(Elective Definitions) ????未被預編譯的FORTH系統部分以源文本形式保存在磁盤上。這是為了更好的控制使用內存空間,可以根據需要決定裝配還是不裝配這些定義中的任何部分。所有“任選定義”的裝配塊稱為“任選快”。比如16塊,16 LOAD?? 可以加載一個小屏面編輯程序。
用戶詞典(User Dictionary) ????在內存中能存貯自己定義的詞的區域稱為“用戶詞典”,詞典區隨著新詞的增加向內存高區生成。詞典中下一個可以用單元總是由變量 DP?指示。在編譯過程中,隨著詞典條目的增加,指針 DP?也逐單元(或逐字節)地調整。因此,DP?是編譯程序的書簽;在詞典中指向的位置是編譯程序下次可編譯的地方。 ????DP?可能被 ALLOT 使用。ALLOT 使DP向前推進給定數量的字節數。系統中有一個詞 HERE 就是用DP實現的 。 DP ( ?--- ?addr ?) ? ?詞典指針變量,它包含詞典中下一個自由存儲地址,他的值可以由HERE給出,也可以由ALLOT更改。 HERE ? ( ? --- ?addr ?) ? 把下一個可用詞典位置的地址留在堆棧頂;(定義里面就用到了上面的指針變量 DP) ? ??? ? ?? ?//HERE 來確定自己寫的程序占用了多少內存空間
高速暫存緩沖區(The Pad) ????詞典中HERE一固定距離有一個小塊叫做“高速暫存緩沖區”它通常用于保存先被操作然后送往終端的 ASCII 碼字符串。例如,在使用 TYPE 之前,數字格式化詞用這個區域來保存轉換過程中的數字的 ASCII 碼。 ????pad的大小沒有限制。在大多數系統中,在pad的起點到參數堆棧棧頂之間有數百個甚至數千個字節。 ????由于pad的起始地址被規定與最后的詞典條目有關,所以每當加入新的定義或執行了 FORGET 或 EMPTY 之后,該起始地址都會發生變化。但是這種安排是安全的。因為當上述時間中的任何一件發生時,pad都不會被用到。詞 PAD 給出了pad的當前起始地址。 ? ? ??? ?//可以看出pad的空間大小是256 (0-255)剛好是一個字節。 PAD ?( ?--- ? addr ?) ? ?留下保存中間處理過程數據的暫存區低地址。PAD的地址或內容可以改變,如果下一個可用詞典單元的地址被改變,則這些數據被舍棄。PAD的容量為84個字符。
參數堆棧(Parameter Stack) ????數據壓入數據堆棧的時候只是棧頂指針的移動;把一個數放入堆棧是,指針先減1,然后數值被存入指針指向的位置。一個數移出堆棧,指針增加1。(堆棧地址是從低到高,數據最先存在在地址高位上,向上增長也是就向著低地址方向增長)。數據堆棧是向下生長(向著地址減小的方向增長) SP@ ? ( ?--- ?addr ?) ? 將堆棧頂地址回送到堆棧頂的與計算機相關過程,所說的堆棧頂的地址是指在執行SP@之前的地址。(取出堆棧頂指針) ? ?? ??//最早放入堆棧中的數據存放在最高位,要想訪問前面的數據就要用當前棧頂元素地址+上偏移量,一個字節包含兩個8位數據,所以偏移一個要+2. 有了這個就可以隨心所欲的訪問堆棧中任意位置的元素。(最好不要在編程中使用) S0 ?( ?--- ?addr ?) ? ?含有“堆棧指針初始值的用戶變量。 SP@ ?( ?--- ?addr ?) ?將堆棧頂地址回送到堆棧頂的與計算機相關過程,所說的堆棧頂的地址是指在執行SP@之前的地址。 棧底由一個 S0 的變量指示。S0 的內容總是“空棧”單元的下一個單元的地址。
輸入信息緩沖區(Input Message Buffer) ????S0 也包含著“輸入信息緩沖區”的起始地址。輸入信息緩沖區向內存高區生成(與pad方向相同)。當從終端輸入文本時,文本便存放在此緩沖區,文本解釋程序將在此緩沖區內掃描文本。
返回堆棧(Return Stack) ????在輸入信息緩沖區的上面是返回堆棧,其操作相同于參數堆棧,但是返回堆棧沒有類似于SP@和S0這樣的高級FORTH詞。
用戶變量區(User Variables) ????返回堆棧上面就是用于存放“用戶變量”的內存區域,這些變量包括 BASE ,S0 ……
塊緩沖區(Block Buffers) ????在高端內存區是若干塊緩沖區。每個緩沖區為一個磁盤塊提供1024個字節空間。當訪問磁盤快的時候(顯示或裝配),系統將該塊從磁盤中復制到緩沖區,在緩沖區能由編輯程序修改該塊或由 LOAD 解釋該塊。
轉載于:https://www.cnblogs.com/meihao1203/p/10218832.html
總結
以上是生活随笔為你收集整理的Forth 内存布局的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bc汇编指令用法_BC操作流程
- 下一篇: 炫彩流光按钮