BCC16VM 教材:記憶體指令

所有要交給 CPU 處理的資料,都必須先放進暫存器。 只有暫存器裡面的資料可以被送進 CPU 的電路去做計算。 而暫存器數量很少,例如 BCC16VM 只有三個,所以處理完的資料要放回記憶體, 以便空出暫存器處理下一筆資料。 因此,必須有指令在記憶體和暫存器之間搬移資料。 BCC16VM 提供六個這種指令:三個 store 和三個 load。 所謂 load 就是將資料從記憶體上傳到暫存器, 例如 10100010 就是 Load R0 0010 的意思, 記做 R0 <- 0010; 而 store 就是將資料從暫存器下載到記憶體, 例如 11010000 就是 Store R0 0000 的意思, 記做 R0 -> 0000

例如在資料段的 0010 位址填入 01001101, 在指令段的 0000 填入機器碼 10100010 (load R0 0010), 然後在指令段的 0001 填入機器碼 11010000 (store R0 0000)。 執行後資料段的 0000 位址,數值變得和 0010 一樣。 這就是『將 0010 複製到 0000』的程式。

上述機器碼的程式,用記號來寫,如下:

R0 <- 0010
R0 -> 0000
用組合語言來寫,如下:
Load R0 0010
Store R0 0000
用二進制來寫,如下:
10100010
11010000

當我們用高階語言 (例如 C) 宣告變數 xy, 其實編譯器把它們變成資料段的位址。 我們用 xy 給變數的那口箱子命名, 而電腦只能用二進制數字命名。 如果電腦分配 0000x, 分配 0010y, 則 x=y; 這句話就是這樣完成的。

電腦不能不透過暫存器而將記憶體任何位址內的資料,抄到另一個位址去。 也就是說,在主機板上,記憶體都是直接與 CPU 電路連線, 兩個記憶體之間並沒有互通的電路。

習題

  1. 用 C 語言交換兩個變數的值,必須透過第三個變數。例如
    unsigned int x, y, tmp;
    tmp = x;
    x = y;
    y = tmp;
    若變數 x 放在 0000, 變數 y 放在 0001, 變數 tmp 放在 0010, 請翻譯上述 C 程式為機器碼。應該需要六個機器碼,動用一個暫存器。 (自行輸入資料,觀察執行結果。)
  2. 如果直接用組合語言或機器碼寫程式,則可以不需要第三個變數, 就能交換兩個變數的值。 若變數 x 放在 0000, 變數 y 放在 0001, 請寫一個機器碼程式,交換 xy 的值。 動用兩個暫存器,只要四個機器碼就可以了。
[BCC16-B]
單維彰 (2004/06/09) ---
[Prev] [Next] [Up]