所有要交給 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) 宣告變數 x 和 y, 其實編譯器把它們變成資料段的位址。 我們用 x 和 y 給變數的那口箱子命名, 而電腦只能用二進制數字命名。 如果電腦分配 0000 給 x, 分配 0010 給 y, 則 x=y; 這句話就是這樣完成的。
電腦不能不透過暫存器而將記憶體任何位址內的資料,抄到另一個位址去。 也就是說,在主機板上,記憶體都是直接與 CPU 電路連線, 兩個記憶體之間並沒有互通的電路。
習題
unsigned int x, y, tmp; tmp = x; x = y; y = tmp;若變數 x 放在 0000, 變數 y 放在 0001, 變數 tmp 放在 0010, 請翻譯上述 C 程式為機器碼。應該需要六個機器碼,動用一個暫存器。 (自行輸入資料,觀察執行結果。)