• 沒有找到結果。

第四章 解碼器相關指令

4.8 工具指令

程式發展工具指令

FORTH ENGINE 中有了解碼器和編碼器,就是一個很完整的操作系統了。

為了用它來發展應用的軟體,必需再加上幾個工具指令,幫助做偵錯及系 統檢查的工作。這樣就形成了一個很有效的程式發展環境,可以很快速地 寫作,並且修改一些複雜的應用程式。

DUMP ( a u -- ) 將記憶體由地址 a 開始的 u 個字碼顯示到終端機 上。用這個指令可以檢查全部記憶體中所有的資 料和執行碼。若輸入輸出裝置也都掛在記憶匯排 上,它也可以用來檢查所有的輸入輸出裝置的狀 態。

.S ( -- )

SEE ( -- ) 反編碼指令。將其後的字串當作一個指令名稱去 查字典,若有相符的指令,將其執行碼欄中當初 所定義的內容顯示在終端機上。遇到 CALL 機器 碼,會將所呼叫的指令名稱印出。這 SEE 指令可 用來檢查剛定義的指令,是否正確地依所預期方 式編碼成功。

WORDS ( -- ) 將字典中所有指令的名稱顯示到終端機上。檢查 檔案中的指令集是否都成功地被編碼載入系統,

或可瞭解所完成的進度。

READ ( -- ) 從終端機直接下載檔案文字到 FORTH ENGINE,存 在 PAD 開始的記憶區。當接收到 ESC 控制字符時 就結束下載。

OK ( -- ) 解讀由 READ 下載存在 PAD 的文字序列。依序執行 解碼或編碼的動作,建立、設定、或執行不同的 應用系統。

SEND ( a u -- ) 將從位址 a 開始長度為 u 的資料,經由終端機,

從 FORTH ENGINE 上傳到主電腦中儲存。若包括了 整個系統含字典的結構,上傳的資料即可直接燒 入 EPROM 建成嵌入式系統。

FORGET ( -- ) 在字典搜尋與下一字串名稱相符的指令。找到後 將該指令及其後所有定義的指令,從字典的串連 鏈上切除。這時字典即恢復到該指令未被編入前 的狀態。這個清除字典的指令,在反覆試驗一段 應用程式時十分有用,不需浪費 FORTH ENGINE 的 記憶空間。

DIAGNOSE (--) 這一個指令會執行到大部份的機器碼,用以檢驗 所有的機器碼是否都被 FORTH ENGINE 系統正確地 執行,因而能確認 CPU 是正常工作了。

表 4-12 工具指令

4.9 組 合 器 指 令

在前述,組合器的設計和製造章節中,已看到如何在 PC 上設計組合器,

用來組合 FORTH E NGINE 的整個系統。當這個系統在 FORTH ENGINE 上動起 來之後,我們的編碼器能用 CALL 的形式編組新的指令。要充分發揮 FORTH ENGINE 電腦的功能,我們在解碼器和編碼器之外,還需要一個在 FORTH ENGINE 上跑的組合器。因為在編碼器上,原已經建好了許多構築結構化程 式的指令。所以現在只要加上能夠把四個機器碼塞入一個字碼的工具,就 可擁有一個完整的組合器了。為了做這件事,我們將 FEOS.ASM 中一些指令 搬進 FORTH ENGINE 系統:

Mask ( -- mask ) 此為系統放置四組面罩之矩陣。選擇面罩之 一,可用以將一個 6 位元的機器碼塞入目前編 碼的 16 位元字碼中。

ALIGN ( -- ) 準備將機器碼編進下一個空的 16 位元字碼中。

W ( n -- ) 將資料堆疊上的 n,編入正在編碼的 16 位元字 碼裡。

,I ( n -- ) 將 6 位元的機器碼 n 塞入現在編碼的 16 位元字 碼中,它會依序編四個機器碼,然後會將新碼 編入下一個 16 位元字碼中。

Anew ( -- ) 若目前編碼的 16 位元字碼還沒有裝完,補滿 NOP 以便開始編下一 16 位元的字碼。

DoInst ( -- ) 將程式中此指令後面原編入的機器碼取出,編 入現在編碼的 16 位元字碼中。這個指令是組合

入現在編碼的 16 位元字碼中。這個指令是組合 器的核心。

表 4-13 組合器指令

所有在 FORTH ENGINE 的組合器用的機器碼指令、都用小寫的名字,這樣不 會和常用的 Forth 指令相混淆了。這一套集合指令是:

shl shr xor and div add dup nop drop 4.10 巨 集 指 令

為了建造最精簡又快速的 FORTH ENGINE 系統,在 KERNEL 中我們定了 許多巨集指令,這些指令只在建造 FORTH ENGINE 系統的 PC 上有用,在建 好的系統用的是 FORTH ENGINE 機器碼,就沒有用了。為了在 FORTH ENGINE 也能使用這些指令,必須另建一套給解碼器和編碼器使用。這些指令是:

EXIT EXECUTE ! @ R> R@ >R SWAP OVER 2DROP + NOT NEGATE 1- 1+ BL +!

4.11 ebFORTH 與 LISP 的 比 較

這樣做下來,就是一個完整的操作系統了。雖然所有的指令有 200 多 個,但一個操作系統並不如想像的那麼困難、端看使用者的需求可已精簡 也可以擴充.是一個具彈性的系統。

ebForth 和 LISP 有很多類似的地方。它們的基本假設都是:任何電腦 能做的事,都可以用表列【LIST】的方式來表達。所以所有的程式都是一 系列的表列。在 FORTH ENGINE 中,這些表列主要即最有效率的一系列 CALL 機器碼。

LISP 麻煩的地方在於它是從上到下【Top Down】的寫法。沒有預先定義好 的指令也可以放在表列中,到執行時才看該指令是否定義好。而且還要用 許多括號來界定表列的範圍。ebForth 則是由下到上【 Bottom Up】的寫法,

所有指令在用時必須先被定義好。這樣的編碼工作就很容易又有效率,產 生的系統也精簡快速。

相關文件