第貳篇 基礎篇(第三課)

3.1 變數(VARIABLE)

FORTH 文字" VARIABLE "是一個定義詞,用來宣告變數的名稱。   如果你鍵入           VARIABLE my.name     則 FORTH 便會在字典中產生一個新的詞叫 my.name     字典中所有的詞均擁有相同的一般格式,包括一個頭部(header) (由一查看   區、名稱區、聯結區所組成) 和一個身部(body) (由執行碼區和一參數區所   組成)。     在F-PC中,這頭部(header)和身部(body)實際上被儲存在不同的區段   (segment) 中。     在 8086/8088/80286 機型中,1 Mbyte地址空間被分割成若干個 64k 大小的   段落,一個在電腦中實際的地址是由一個 16 位元的區段地址   (segment address) "seg" 和一個 16 位元的位移地址(offset address)    "off" 所組成。完整的地址被寫成區段:位移(seg:off),區段位址可在任何   以 16 位元組為單位的標界上開始,稱做一小段(paragaph) 。因此,如果要   使用記憶體中任一個位元組,你必須指明它的區段地址和位移地址。

對 my.name 這字而言,字典結構看起來會像這樣:                             頭部(HEADER)     ________               查看區地址         --->  VFA | VIEW |                                            |------|               聯結區地址         --->  LFA | LINK |                                            |------|               名稱區地址         --->  NFA | 7 M  |                                            | Y .  |                                            | N A  |                                            | M E  |                                            |------|               到身部的指標   ------->      | ^CFA | -------|                                            |------|        |                                        Head Segment YSEG   |                                        頭部區段            |                      身部(BODY)            ________        |               執行碼區地址       --->  CFA | CODE | <------|                                            |------|               參數區地址         --->  PFA | 0 0  |                                            |------|                                        Code Segment ?CS:                                        執行區段

查看區包含一個字母計量數,功能相當於從一個檔案起點到這一行程序的位   移地址;當你使用"VIEW"指令來查看任何一個 FORTH 字典中的詞時,查看   區將指出該詞在檔案中的位置。     聯結區包含一個指標指到前一個已被定義的詞頭部的聯結區(LFA)。   名稱區包含由一個字串長度和 1 - 31 個字的字母所構成的名稱 。指到執行   區的指標,內含一個在執行區段中該身部執行區的位移地址。在 F-PC 中使   用這個指令 ?cs: 它將會告訴你執行區段的區段位址。     執行區段包含著該詞被執行的機械碼,這種方式叫做直接線串碼為   (direct threaded code) 為 F-PC 所使用。許多符式使用間接線串碼   (indirec threaded code) 該種 FORTH 的執行碼區包含一個指標指向真正被   執行之機械碼。對一變數而言,執行區包含著三個位元組的指令 CALL >NEXT   。>NEXT 是 F-PC 內部執行機構,在本課稍後會有描述。CAL 指令會自動地   將下一個指令的地址放入(PUSH)堆疊(stack)中,但是在 FORTH 巧妙運用下   它不是一個指令的位址,而是參數區位址。     參數區對各種不同詞類中包含各種不同內容。對一個變數字而言,參數區包   含該變數的 16-bit 值。     當一個變數被宣告時,會將一個初值的零存入參數區內。   當你鍵入一個變數的名稱時CALL  >NEXT的機械指令在執行區內會被執行,導   致參數區地址被留在堆疊(stack) 。     如果你鍵入           my.name . (注意後面的" ."為輸出指令)       則  my.name  的參數區位置(PFA)就會被印出,試試看。

3.2 變數的抓取(FETCH)與儲存(STORE)

Forth 的詞:

!       ( n addr -- )   ( "store" )儲存"n"的值在 addr 中 6 my.name !             將 6 這個值存在 my.name 變數的 PFA 中 @       ( addr -- n )   ( "fetch" ) 抓取在 addr 中所儲存的值、並且將它放在堆疊 (stack) 中 my.name @ .             將儲存在 my.name 中的值抓取印出

堆疊變數

系統變數 SP0 包含一個空堆疊的堆疊指標值,因此           SP0 @   會傳回一個在堆疊(stack)中無任何物時的堆疊(stack)指標的位址。   FORTH 的詞 SP@ 傳回最後推入(push)堆疊(stack)項目的位址。也就是說,它是堆疊(stack)指標的現值。   FORTH 的詞 DEPTH 傳回堆疊(stack)目前的深度(數目)。它被定義如下: