鸚鵡虛擬機器/鸚鵡組合語言
鸚鵡虛擬機器 (PVM) 操作在一個特殊用途的位元組碼格式上。所有 PVM 中的指令都將轉換為位元組碼指令,以供虛擬機器操作。就像普通匯編語言與底層機器碼指令之間存在一對一對應關係一樣,鸚鵡位元組碼指令也與鸚鵡組合語言 (PASM) 之間存在類似的對應關係。
PASM 與傳統的組合語言非常相似,不同之處在於指令提供了對鸚鵡系統許多動態和高階功能的訪問。
在鸚鵡內部,存在許多不同的指令。一些指令只是彼此的變體,具有相同的行為,但引數不同。例如,存在用於以下操作的指令:
add_n_n_n
add_i_i_i
add_i_i_ic
add_n_n_nc
指令名稱後面的字母指定了該指令需要哪種運算元。add_i_i_ic 接受一個整數 (i) 和一個整數常量 (ic),並返回一個整數 (i)。add_n_n_n 接受兩個浮點數,並返回一個浮點數。
在 PASM 中,當您編寫以下語句時
add $I0, $I1, $I2
鸚鵡將從列表中查詢相應的指令 add_i_i_i 並呼叫它。使用者看到了 1 條指令“add”,但鸚鵡實際上有多條指令,並自動為您決定使用哪條指令。如果您在鸚鵡中輸入以下內容:
add $P0, $I1, $I2
您將收到一條錯誤訊息,指出沒有這樣的指令 add_p_i_i。這將有助於您除錯程式。
鸚鵡是一個基於暫存器的虛擬機器。存在不確定的數量的暫存器,不需要在呼叫之前例項化它們。虛擬機器將確保在需要時建立暫存器,並根據需要重新排列它們。暫存器名稱是詞法作用域的,因此在一個函式中的暫存器“$P0”不一定與另一個函式中的暫存器“$P0”是相同的資料位置。
所有暫存器都以“$”符號開頭。在“$”之後,稱為“符號”,有一個字母表示暫存器的資料型別,後面是暫存器編號。共有 4 種資料項型別,每種型別都有一個唯一的暫存器字元識別符號。它們分別是:
- 字串
- 字串暫存器以“S”開頭。字串暫存器可以命名為“$S0”或“$S100”等。
- 整數
- 整數暫存器以“I”開頭。整數暫存器可以命名為“$I0”或“$I56”等。
- 數字
- 浮點數暫存器,可以儲存浮點數的暫存器,以字母“N”開頭。這些暫存器可以命名為“$N0”或“$N354”等。
- PMC
- PMC 是高階的面向物件的資料型別,PMC 暫存器可以用於儲存多種不同型別的資料。PMC 暫存器以“P”識別符號開頭,可以命名為“$P0”或“$P35”等。
一個基本的 PASM 語句包含一個可選的標籤,一個指令助記符和一系列逗號分隔的引數。以下是一個示例:
my_label: add_n $P0, $P1, $I1
在這個例子中,add_n 指令對兩個暫存器進行加法運算,並將結果儲存在第三個暫存器中。$P1 和 $I1 中的值相加,結果儲存在 $P0 中。請注意,運算元的型別不同。其中一個引數和結果都是 PMC 暫存器,但第二個運算元是整數,add_n 指令是整數指令。鸚鵡將在執行此類指令時自動處理必要的資料型別轉換。唯一的要求是能夠在兩種資料型別之間進行轉換。如果可以,鸚鵡將處理細節。但是,在某些情況下,自動型別轉換是不可能的,在這種情況下,鸚鵡將引發異常。
PASM 只有很少可用的指令。
- .pcc_sub
- 此指令定義了一個新子例程的開始。