BCC16VM 教材:產生常數

當我們用程式語言宣告變數 x,然後指派 x=7;, 電腦需分配記憶體給 x,然後將代表 7 的位元排列儲存到那個記憶體。 但是,電腦從哪裡拿到『代表 7 的位元排列』? 在 BCC16VM 我們可以直接用鍵盤將資料寫入資料段的記憶體,所以這不成問題。 但是,真正的電腦,只有指令段可以被寫入機器碼, 而那些機器碼來自於磁碟機。 所以,若要模擬真正的程序,則是應該由 CPU 產生『代表 7 的位元排列』, 然後將這筆資料下載到記憶體裡面。

BCC16VM 的 generate 指令會產生一個無號整數的位元排列, 因為 4-bit 的參數部份已經用來指定需要產生的常數, 所以無法指定那個常數產生到哪個暫存器。 我們的設計是,令產生的常數必定放在 R2。 如果 x 配給的記憶體是 0000,則

x = 7;
是用以下兩句機器碼完成的。

記號機器碼
  R2 <- 7 01010111
  R2 -> 0000 11110000

BCC16VM 只能產生 4-bit 無號整數,也就是 0--15。 這也是一般 CPU 的常見限制:常數產生器總是無法 (或至少是不容易) 產生比較大的數。 如果需要指派比較大的數值,就必須先產生兩個或甚至更多 0--15 之數, 然後再用加減乘除之計算,產生需要的常數。 以 BCC16VM 而言,最大容許的常數是 255。

以下需要暫存器之間的資料複製,指令碼 1001, 而 4-bit 參數碼的前兩 bits 代表 Ra,後兩 bits 代表 Rb。 例如 10010010 就是把 R2 的內容抄去 R0, 記做 R0 <- R2。

以下還需要加、乘運算,請參見指令簡表。

例如,若 x 分配到的記憶體是 0000,則

x = 230;
是用以下六句機器碼完成的。

組合語言機器碼
  generate 15 01011111
  copy R0 R2 10010010
  multiply R0 R2 00110010
  generate 5 01010101
  add R0 R2 00010010
  store R0 0 11010000

執行之後,R0 的內容是 11100110,轉換成十進制就是 230。

習題

  1. 請用常數產生器在 R0 中放置 255。不要作弊:不要先寫入資料段, 再用 load 指令。
[BCC16-B]
單維彰 (2004/06/10) ---
[Prev] [Next] [Up]