第二章、密秘指令 I (簡易機器指令集)

看著音羽像是受到什麼嚴重打擊似地嘟起了嘴趴倒在桌上的模樣,桐仁忍不住噗嗤一聲地笑了出來。

「有、有……有什麼好笑的啦!」

音羽漲紅著臉抓起桌上的考古題,霹哩啪啦地往桐仁的方向丟去,氣鼓鼓地說道:「你知道不知道我教了她幾次啊!結果小深夏沒有一次聽得懂的耶……超挫折的耶!」

「嗚……對、對不起嘛,我是真的聽不懂嘛……」

大概是覺得都是因寪自己才造成這樣的局面,深夏怯生生地小聲說道,有種就快要哭出來了的感覺。

「呃……那個,我們可以繼續了嗎?我記得深夏同學應該是明天就要考試了吧?」

「對喔,我都忘記了說。」音羽停下手上的動作,吐了吐舌頭地說。

「……」

覺得如果自己在這個地方吐嘈就輸了的桐仁,這次決定無視音羽的發言,轉頭向深夏問道:「如何,深夏同學,到這邊為止還可以吧?會不會講得太快?」

「喂,不準無視我!」

雖然音羽舉起右臂不斷揮舞著抗議,但桐仁和音羽似乎相當有默氣,對於音羽這樣的舉動視而不見。

「嗯……我想大致上都可以理解吧。」

「那就好,因為接下來的東西,都與前面講到的 Von Neumann 架構還有他的運作模式息息相關,如果沒有先弄懂的話,後面的部份就會變得很難以理解了喲!」

見到深夏點了點頭,桐仁接著說道:「剛剛講的,算是電腦如何運作的大概念。總而言之,目前大多數的電腦,都是照著像是剛剛講的 Von Neumann 機關的方式運作。不過到目前為止,我們講的都只是機關的運作流程,卻沒有講到這個機關可以做些什麼事。」

「可以做的事……學長是說放在保密櫃裡的密秘指令嗎?」

「嗯,剛剛講過這個 Von Neumann 型式的機關,必須嚴格遵照一定的作業程序,而且所有的指令都是從保密櫃取出,他們根本對於過去和現在一無所知對吧。所以實際上真正控制 Von Neumann 機關在做什麼事情的,是那些指令的安排者。至於每個機關可執行的指令都有一點不同……例如,妳還記得剛剛說的,那台比記型電腦的 CPU 的型號嗎?」

「好像是 Intel Core i5 還什麼的。」

「對,像這個 CPU 它可以執行的指令就超過 100 種以上,但由於計概這門課只是介紹電腦的運作原理,所以老師在課堂上說明的時候,只定義了十一個機關可以懂的密秘指令。深夏學妺,可以麻煩妳稍微唸一下,在講義網頁上應該有。」

「好的,我找一下……」

「唉呦,小深夏妳都沒有預習嗎,在網頁中間的部份啦!」

在深夏找到網頁上關於指令的部份,並且一項一項地唸出來時,桐仁也在白板上畫上一張相對應的表格。

編號 指令名稱 指令參數 說明
0 LOAD 記憶體位置 讀取記憶體內容至暫存器,完成後將 PC+1
1 STORE 記憶體位置 將暫存器內容回存至記憶體,完成後將 PC+1
2 ADD 記憶體位置 將暫存器上的值加上記憶體內的值,完成後將 PC+1
3 SUB 記憶體位置 將暫存器上的值減去記憶體內的值,完成後將 PC+1
4 JUMP 記憶體位置 將 Program Counter 的值改成指定的記憶體位置
5 SKIP 如果暫存器的值 >= 0,將 PC+1,否則 PC+2
6 INPUT 從輸入裝置讀取資料至暫存器,並將 PC+1
7 OUTPUT 將資料從暫存器吐到輸出裝置,並將 PC+1
8 CALL 記憶體位置 將現在 PC 上的值加一後放到堆疊上,然後將 PC 改成指定值
9 RETURN 從堆疊上取出一個數值,並將 PC 改成這個數值
10 HALT 程式停止執行

「喏,這張表格定義的一些我們這個虛構的 Von Neumann 機關可以理解的密秘指令,僅管數量只有十一個,但也夠用來說明整個電腦還有程式的運作的模式。」

「那個……學長,為什麼指令的編號會從零開始啊?老師的講義上好像也是這樣寫……」

「問的好,其實我也不是很清楚。但是在計算機科學的領域裡,或許是為了一些計算上的方便,經常都是以零做為起始的數值,所以好像也只能去習慣這樣的編號方法了。在接下來的說明裡面,我們也會將記憶體位址以零為起始編號。」

「呣……聽起來好像有點奇怪呢。」

「小深夏妳很愛鑽牛角尖耶,反正從零還是一開始算又沒什麼不同啊。」

「大家一開始多多少少都會覺得不太對勁,不過習慣之後就會覺得從零開始算起好像還滿合理的喲。那接下來我們就一一來看一下這十一個指令到底在做什麼吧。」

「嗯。」

「其實這十一個指令,大部份都是以兩個為一組,而且指令名稱也多多少少反應出了這些指令在做的指。其中 LOAD / STORE 是一組、ADD / SUB 是一組、JUMP / SKIP 是一組、INPUT/OUTPUT 是一組、CALL / RETURN 是一組,最後的 HALT 則是單獨的一個指令。

「LOAD / STORE 這一組指令可以說是最基本的指令,做用分別是將特定記憶體位置的內容複製一份到暫存器中,和將暫存器上的值複製到某個特定的記憶體位置。」

「等等,學長,什麼是暫存器啊?」

「暫存器指的是在 ALU 中儲存小量資料的區域,像我們之前講到的 Program Counter 就是 ALU 中的一個暫存器,而 Von Neumann 架構圖上的 ALU 中有一個 Accumulator 對吧,那也是暫存器的一個,妳可以把它想像成是 ALU 部門的辦公桌。

「也就是說,妳可以把 LOAD 指令看成是 CU 部門叫 ALU 部門的人將特定保密櫃格子裡的內容,抄寫一份放到 ALU 部門的辦公桌上。舉例來說,如果 CU 部門看到 LOAD 30 這個指令的話,就會叫 ALU 部門將保密櫃第 30 格的內容,抄寫一份到 ALU 的辦公桌上。相對的,如果看到的是 STORE 40 這個指令的話,ALU 部門就會將辦公桌上的內容,抄寫一份到保密櫃裡第 40 格的地方。當然,這兩個指令結束後,都會將 Program Counter 加一,也就是會 CU 會取出下一道指令來解析。」

桐仁一邊解釋著,一邊在白板上寫下如下的字樣,一邊說道:「接著我們來看一些實際的例子,深夏同學,妳覺得在這樣的狀態下,最後記憶體和暫存器內的值會是什麼呢?」

  • 記憶體位置編號 20 內的值:30
  • 記憶體位置編號 40 內的值:50
  • 執行以下的指令:
    • LOAD 20
    • STORE 40

「嗯……首先是 CU 部門打開第二十號保密櫃格子,ALU 將裡面的 30 抄到自己部門的辦公桌上,接著因為 Program Counter 被加了一,CU 部門會看到 STORE 40 這個指令,就會叫 ALU 部門把辦公桌上的 30 抄寫到保密櫃第 40 格的位置。所以編號第二十格的保密櫃現在裡面是 30,而 ALU 辦公桌上的值也是 30,然後保密櫃第 40 格的地方是……咦?!學長是 30 還是 50 啊?!」

「如果沒有特別講的話,通常這些指令都會將原本辦公桌上或是保密櫃內的東西丟掉,換上新的一份喲!」

深夏右手的食指抵著嘴唇慢慢說道:

「嗯,也就是說……這題根本就是個陷阱題,不論是記憶體編號 20、記憶體編號 40 或是暫存器上的值,都是 30 對吧?」

「沒錯,其實沒有那麼難對吧?再接下來的 ADD / SUB 也和 LOAD / SAVE 差不多,只是這次是把暫存器的內容加上或減掉記憶體內的值,最後再將 Program Counter 的值加一,讓 CU 繼續取得下一個指令。換句話說,就是 ALU 部門會先去查詢保密櫃裡某一格的內容,再將辦公桌上的數值加上或減掉剛剛取得的數字,如果配上之前的兩個指令的話……」

桐仁講到這邊,便順手將白板上的字樣擦掉,重新寫上新的題目。

  • 記憶體位置編號 20 內的值:30
  • 記憶體位置編號 40 內的值:50
  • 記憶體位置編號 50 內的值:60
  • 執行以下的指令:
    • LOAD 20
    • ADD 40
    • STORE 40
    • SUB 50

「如何,深夏同學,妳認為上面的幾個指令執行完後,這個 Von Neumann 機關裡各個部門的狀態會是怎樣呢?」

「呣……第一個指令是先將保密櫃第 20 格裡的 30 抄到 ALU 的辦公桌上。第二個指令再將保密櫃第 40 格裡的 50 加到辦公桌的 30,所以現在辦公桌上是 80,接著第三個指令的 STORE 會把桌上的 80 抄到保密櫃第 40 格的地方。最後,ALU 部門會去取得保密櫃第 50 格裡的資料 60,再用自己辦公桌上的 80 減去……」

音羽拿著筆不斷在筆記紙上塗來劃去,同時嘴裡小聲的唸著,看樣子是試著要將整個執行的過程全部都呈現和記錄在紙上。

「嗯……這樣完成啦!保櫃櫃第 20 格裡是 30、第 40 格是 80、第 50 櫃是 60,最後 ALU 辦公桌上是 20 這樣對吧,學長?」

「不錯喲,看來深夏同學抓到感覺了呢。在這個例子裡,記憶體裡的值確實分別是 30、80 和 60 沒錯,而在最後一個步驟,暫存器上的值是 80 減去 60,最後留下來的就是 20 啦!」

發現自己深夏可以利用自己想出的譬喻正確解答,桐仁的嘴角露出了微笑這樣說道。但另一方面,從被無視後就一直趴在桌上休息的音羽,卻似乎有些吃醋似地小聲嘟嚷道:「哼,這有什麼好得意的啊……竟然高興成那樣。接下來才是問題唄!」

回響