第三章、密秘指令 II (簡易機器指令集)

「那接下來,我們來看一下組指令的 JUMP / SKIP 吧。就像音羽同學說的一樣,接下來的幾組指令稍微複雜了一些,所以對於初學者來說,會比較難以理解一點。」

「呣……果然是這樣嗎?」

深夏的表情在不安中帶著一些沒有自信的感覺,於是桐仁便笑著答道:「也沒那麼困難啦,只要掌握到一些基礎的要點,就不會搞混囉。例如,深夏同學妳覺得,在我們所建構的 Von Neumann 機關中,指令的執行順序是如何的呢?」

「我想,從剛剛的幾個例子來看,應該是……照著順序執行?」

深夏歪著頭有點不太確定地說道。

「小深夏,不對啦……」

「咦?!可是剛剛的例子裡,指令都是一項接著一項往下執行的啊?!」

「小深夏,妳試著唸一下編號零到三這四個指令說明裡的最後一句。」

「呣唔,『完成後將 PC+1』,唉,好像四個指令的最後一句都一樣耶?!」深夏同學

「深夏同學,這是最關鍵的所在喲。妳再試著想想看,Control Unit 部門是怎麼決定要執行哪一個指令的呢?」

「我想一下喲……也就是說,執行的順序是看每個指令結束後,Program Counter 如何被改變的嗎?」

「叮咚叮咚~」

音羽似乎是情緒來得快去得也快的類型,深夏一答出正確的答案,立刻就誇張地模彷起問答節目裡,來賓回答出正確答案時的音效後說道:

「沒錯喲,程式的執行順序是由 Program Counter 的值來決定的。更正確的說,Von Neumann 機關不知道過去,也不知道未來,只知道目前記憶體裡的資料是多少,以及下一個指令要到哪裡取得。剛剛小深夏覺得會照順序一步一步執行,是因為 LOAD / SAVE / ADD / SUB 這四個指令結束後,都是把 Program Counter 加一,才會看起來像這樣!」

「嗯……所以一切都還是要看 Program Counter 才準確呢。」

桐仁點了點頭,在白板上畫下了另一張的表格,繼續說道:「所以接下來的這兩個指令,就是和更改 Program Counter 有關的,有了這些指令,我們才能真正按照自己的需求,來控制程式執行的順序。」

記憶體位置 內容
0000000000 LOAD 20
0000000001 ADD 40
0000000002 JUMP 4
0000000003 STORE 40
0000000004 SUB 50
0000000005 HALT
~~~ ~~~
0000000020 30
0000000040 50
0000000050 60

「咦?學長,這次的表示方式好像不太一樣咧……」

「沒錯,深夏同學,還記得剛剛提到的,Von Neumman 機關裡指令和資料是存在哪裡嗎?」

「都是在……啊!所以說,這張圖是記憶體裡的狀況囉?!」

「嗯,上半部是指令的部份,下半部則是資料的部份,我們之後都會假設 PC 一開始是指到記憶體位置 0 的地方,也就是從第一個指令開始執行。另外,這次我們多了兩個指令,第一個是 JUMP,這個指令會把 Program Counter 改成指定的值,而另一個 HALT 則是表示程式結束,後面不需要再做事。所以說,這隻程式……」

「等等喲……」還沒等桐仁說完,深夏便開始自言自語地說道:「把第二十格內的值,也就是 30 抄到 ALU 部門的辦公桌上,之後加上 40 成為 70,接著遇到 JUMP 4,把 PC 的值改成 4,也就是下一個執行的指令會是第四格的 SUB 50,那就是將 70 再減掉 50 成為 20……所以最後的結果是保密櫃裡的資料都沒有動到,但 ALU 的辦公桌上的值是 20 對吧?!」

「咦~這真的是小深夏嗎?竟然這麼快就開竅了!啊,我知道了,妳一定是假貨對吧……」

音羽邊說著,邊將就坐在身旁深夏抱進懷中,同時雙手開始在不斷掙扎著想要逃開的深夏身上到這邊捏一下,那邊捏一下,最後甚至開始捏住深夏的雙頰往兩次拉拉扯扯的,而深夏也只能發出意義不明的「呣哇嗯啊~蒲要亂咧啦~~」的這類的聲音來抗議。

雖然只有相當短暫的時間,但桐仁似乎已經隱約察覺到這便是這兩人的相處模式,也不再多說些什麼,只是覺得有趣地看著深夏和音羽兩人的互動,沉浸在這瀰漫於小小的社團教室內的歡樂氣氛中。

「嗚啊……」

發現桐仁正緊盯著自己和音羽這邊,深夏輕輕唉鳴了一聲,本來就透著些許粉紅色的臉頰在一瞬染上了更深的紅,同時頭頂也似乎滾燙到要冒出水蒸氣,更別說那已經失去焦點的雙眼了。

相較之下,音羽雖然也露出了一絲絲感到不好意思的神情,但隨即又像是啥都發生似的對桐仁說道:「呵呵,真是抱歉啊,學長。我看我們還繼續吧!小深夏,起來囉~」

「呃……深夏同學,我們可以繼續了嗎?」桐仁對音羽聳了聳肩後說道。

「啊、好、好的!」

「剛剛說的是 JUMP 的部份,這個指令我們直接指定下一個指令要跳到哪邊執行。而接下來的 SKIP 比較複雜一點--接到這個指令時,ALU 部門會先檢查辦公桌上的數字,如果大於等於零,就將 PC 加一,如果是負數,就將 PC 加二--這樣聽起來好像很抽象,所以我們還是直接舉例子好了。」

記憶體位置 內容
0000000000 LOAD 20
0000000001 SKIP
0000000002 JUMP 5
0000000003 LOAD 40
0000000004 SUB 20
0000000005 STORE 60
0000000006 HALT
~~~ ~~~
0000000020 30
0000000040 0
0000000060 0

「喏……假設這是這次的程式,一開始會將保密櫃第二十格的資料拿到 ALU 部門的辦公桌上,接著第二步的時候,因為辦公桌上的數字是 30,大於零,所以 PC 會加一,等於繼續往下執行 JUMP 5 這個指令,而第五格的指令會再把 ALU 現在辦公桌上的 20 存放到保密櫃第六十格的位置--」

「呣……也就是說,這個程式會把保密櫃裡第二十格裡的東西複製到第六十格囉?」

「呵呵呵,小深夏,妳把第二十格改成 -43 之後,再試著解看看最後這隻程式的結果。」

「咦?!把第二十格改成 -43 嗎?!」

深夏感到有些疑惑地歪著頭,開始拿起手邊的自動鉛筆塗塗寫寫,將桐仁畫在白板上的東西抄寫到自己的筆記本上--然後將記憶體圖示上的第二十格的部份,如同音羽所說的,改成了 -43--

記憶體位置 內容
0000000000 LOAD 20
0000000001 SKIP
0000000002 JUMP 5
0000000003 LOAD 40
0000000004 SUB 20
0000000005 STORE 60
0000000006 HALT
~~~ ~~~
0000000020 -43
0000000040 0
0000000060 0

「先把第 20 格的 -43 抄到 ALU 部的辦公桌上,接著第二步的 SKIP……因為桌上的數字是 -43,小於零,所以 PC 會加二--變成下一個執行的是保密櫃第三格的指令--所以下一個指令是 LOAD 40,會將 0 抄到 ALU 的辦公桌上,接著再 SUB 20,也就是用 0 減去第二十格的 -43,現在辦公桌上會是 43……最後再把他抄到保密櫃第六十格的地方。嗯,所以 ALU 部門的辦公桌和第六十格現在會是 43,第二十和四十格沒有變,這樣對吧?」

「深夏同學有沒有發現程式執行完之後,會有什麼有趣的事呢?!」

「啊!第六十格一定會是第二十格的絕對值對吧?!」

「叮咚叮咚~~答對囉!小深夏!這下補考一定可以考個四十分左右的啦!」

「咦?!真的嗎?!」

回響