當我們用程式語言宣告變數 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。
習題