• 沒有找到結果。

第三章 嵌入式符式作業系統的交叉編譯

3.4 變數和常數

3.4.2 巨集指令

FORTH ENGINE 的機器碼大部分都是 Forth 的基本指令。但也有一些較 複雜的 Forth 指令,需用幾個機器碼組合而成。這種指令,一般可用副程 式的方式來建造。但是在 FORTH ENGINE 電腦中,一個 16 位元的字碼可以 塞入 4 個機器碼,所以如果一個 Forth 指令可以直接用 4 個或更少的機器 碼來完成,就比用副程式來建造要節省記憶空間。並且運算速度也可以加 快許多。這種 Forth 指令在我們組合器中,就是以巨集的方式來呈現。巨 集指令直接可將機器碼組合起來,避免了副程式呼叫所需進出返回堆疊的 負擔。

有些巨集指令,如 OVER,需要 5 個機器碼,比用副程式好像還要多佔一點 空間,似乎並不很適當。但是,如果它們在編碼中,前後都是機器碼,或 者是其它巨集指令所產生的機器碼,它們即可有效地合併,連續塞入機器 碼,而不必像組合副程式呼叫指令時,要先把未完成的字碼用 NOP 補滿,

因而會節省空間,也可加快執行速度。

使用巨集指令,整個系統會組合得更精簡快速,更能充分發揮 FORTH ENGINE CPU 的功能。唯一的缺點是巨集指令只能在 FORTH ENGINE 的組合器 內工作。在實際操作時,解碼器和編碼器都無法直接利用巨集指令。因此 我們必須在操作系統中,另外加上一套與巨集指令相對應的副程式指令,

專供解碼器和編碼器使用。

3.4.3 組合指令集

下面這一組指令都是 FORTH ENGINE 的副程式指令,其內部的功能都是 用 FORTH ENGINE 機器碼組合成的。我們為了要 FORTH ENGINE 的運算速度 能再加強到最快的速度,所有副程式可能用機器碼組合的都儘量如此建造 起來。這些指令包括了

指令 疊層表示(輸入-輸出) 說 明

: O< ( n -- f ) 若 n 小於 0,則 f=-1,否則 f=0 OR ( n n -- n )

UM+ ( n1 n2 -- sum carry)算出 n1 加 n2 的和及其溢位號。

?DUP ( n -- n n | 0) 若 n 為 0 則複製一份。

ROT ( n1 n2 n3 -- n2 n3 n2 ) 將堆疊最上三數旋轉。

2DUP ( n1 n2 -- n1 n2 n1 n2 ) 複製堆疊最上二數。

DNEGATE ( d -- d ) 將堆疊上雙數改變數值符號。

ABS ( n -- |n| ) 將堆疊上數值變為絕對值。

= ( n1 n2 -- f ) 若 n1=n2,f=-1;否則 f=0。

2! ( d a -- ) 將雙數 d 存入 a 位址。

2@ ( a -- d ) 從 a 位址取出雙數 d。

COUNT ( a -- a+1 n ) 從 a 位址取出 n,並將 a 加 1。

B> ( b a -- b+1 a ) 將位址 b 處未壓縮資料字碼取出,移入 a 的最低 8 位元,a 中資料向左移八位 元。這是壓縮字串到 16 位元字碼的基本 指令

表 3-6 組合指令集 3.4.4 終端機指令

指令 疊層表示

(輸入-輸出)

說 明

EMIT ( c -- ) 將 ASCII 碼 c 彈出,到終端機上顯示。

KEY ( -- c ) 等使用者在終端機上按鍵,並將鍵入的 ASCII 碼 c 放到堆疊上。

表 3-7 終端機指令

FORTH ENGINE 的終端機介面是一個有效又很簡單的設計。在執行 BYTE_CHANGE 指令時,UART 暫存器中的 LOW_BYTE 送出 8 位元資料,此時 HIGH_BYTE 位元即被移到 UART 暫存器。但我們將 W (0)送入一個正反器,

而這個正反器的輸出直接就連到一個輸出腳位上,此即 FORTH ENGINE 的終 端機輸出埠。

當執行 BYTE_CHANGE 指令時,我們將終端機輸入腳位的狀態鎖入 W(16) , 這是 W 暫存器的溢位元【Carry】,此即終端機的輸入埠了。終端機的輸入 和輸出,即全由 EMIT 及 KEY 來操控。EMIT 及 KEY 用 50us 及 100us 兩個指 令來延遲到 19200 Baud 的半位元及 1 位元的時序。

相關文件