• 沒有找到結果。

第四章 解碼器相關指令

4.1 解碼器相關指令

4.1.2 查 字 典 指 令

FORTH ENGINE 的指令,都是存在記憶體中,一個特定區叫做字典的區 域。每個指令中都有三欄:連接欄、名稱欄和執行碼欄。連接欄為一字碼 長度,其中含一個地址,指到上一個指令的名稱欄。名稱欄的長度不定,

存有指令的名稱及其長度,以壓縮字串的形式儲存。執行碼欄內,則存有 可執行的機器碼及相關資料。

這樣所有的指令在字典裡就都連接成一長串的列表。若連接欄中存的 是 0,表示列表的盡頭。解碼器可在這個字典裡,依輸入的名稱尋找到要執 行的指令。查字典時遇到連接欄裡是 0,就知道已查到了字典的盡頭,都還 沒找到所要的指令,表示名稱錯誤或尚未定義。而查字典的最關鍵指令就 是 FIND。FIND 指令係從 CONTEXT 陣列中找到要搜查的字彙,CONTEXT 可以容 納 8 個不同的字彙,讓解碼器依序搜查,編譯器再定義新指令時,係將新指令 加入 CURRENT 所指向的字彙,編譯器查字典的時候,是先搜尋 VOC1 字彙,依 序搜尋 VOC3,FORTH 字彙,再找不到就是碰到錯誤狀況了,編譯器會將新指令 編入 VOC4 字彙。

FIND ﹙ a va -- xt na | a o ﹚

指令名稱字串在位址 a,va 為搜尋起點的指 標,其內容為最後定義而被納入字典之指令的 名稱欄地址。由 va 開始查字典,若找到的指令 其名稱與所給之字串相同,留下該指令執行碼 的地址 xt 及名稱欄的地址 na。若查完字典仍 找不到,則保留原字串位址 a,並給一個 0 的

旗號表失敗。

NAME? ﹙ a -- xt na | a o ﹚

將系統變數 CONTEXT 作為字典搜尋起點的指 標,從其中可取出字典最後定義的名稱欄地 址,與所給在位址 a 的名稱字串相比,以搜查 字典中該指令的執行碼地址 xt 及名稱欄的地 址 na。

SAME? ﹙ al a2 u -- a1 a2 f ﹚

比較在 a1 區和在 a2 區兩個長度為 u 的字串,

若兩個字串完全相同,則 f=0,若有任何不等 的字碼,f≠0。

NAME> ﹙ na -- xa ﹚ 由指令的名稱欄地址 na 換算出執行碼欄的地 址 xa。

表 4-2 查字典指令

4.1.3 詞典中指令的結構

call doVOC addr VOC4

VOC3

VOC4

call doVOC addr VOC3

VOC2

VOC3

call doVOC addr VOC2

VOC1

VOC2

call doVOC addr VOC1 FORTH

VOC1

call doVOC addr FORTH

0

FORTH

字典延伸區 字典延伸區

VOC4字彙 VOC4字彙

VOC3字彙 VOC3字彙

VOC2字彙 VOC2字彙

FORTH字彙 FORTH字彙 VOC1

VOC3 FORTH

0 0 0 0 0 0 0

VOC4 VOC4

VOC1字彙 LASTVOC

CONTEXT

CURRENT

系統變數 字彙 字典 (RAM記憶區)

VOC2

VOC4 VOC1 FORTH

VOC3

圖 4-1 易符字典結構

4.1.4 字的資料結構

Link field Name field Code field

$1000h

$1004h

$1020h

$1000h

$1024h

LINK ADDRESS==>連接欄位址,指向前一個字的name address NAME ADDRESS ==> 名稱欄位址,名稱可以有1-31個位元

CODE ADDRESS ==> 執行欄位址

$00001004h 指向前一個字的Name field

$32317003 code field

$1028h

名稱為cold,第一個位元組是名稱的字元數

CODE ADDRESS

$00001024

$1030h

$332317005

$1034

code field

$103C

指向前一個字的Name field

名稱為p1234,第一個位元組是名稱的字元數

執行欄位址

圖 4-2 字的資料結構

4.2 輸 入 文 字 序 列 的 指 令

KEY 和 EMIT 是終端機輸入輸出的基本指令。由此二指令衍生出許多高 階的輸出輸入指令,支持 FORTH ENGINE 系統的人機界面。

QUERY ﹙--﹚ 從終端機接受最多達 80 個字符的字串,並將此字 串存入終端機輸入區﹙TIB﹚。

ACCEPT (b u1 -- b u2) 從終端機接受 u1 個字符的字串,並將其存入 b 區。若使用者接收到 u1 字符前按了 RET 鍵,所實 際接受到的字符數是 u2。

EXPECT ( b u -- ) 從終端機接受 u 個字符,存至 b 區,實際所接受 到字串的長度則存於 SPAN 中。

^H ( bot eot cur - bot eot cur )

執行退格清除鍵【Backspace】的功能。若 cur=bot 則三參數保持不變,若 cur>bot,則將 cur 減 1,

同時輸出三個 ASCII 字碼 Backspace、Space、

Backspace,以清除終端機上才輸入的字符。

TAP (bot eotcur–

bot eot cur )

接受一個字符 c,存入記憶區,並將 cur 加 1。

KTAP (bot eot cur- bot eot cur)

接受一個字符 c,存入記憶並處理 CR、BS、及其 他 ASCII 控制符號。

表 4-3 輸入文字序列的指令

相關文件