目錄
- 前 言、一些小小的說明
- 序 章、文學少女唸錯科系了?!
- 第一章、美麗新世界的工作制度(Von Neumann 架構)
- 第二章、密秘指令 I (簡易機器指令集)
- 第三章、密秘指令 II (簡易機器指令集)
說明
這一章講的內容,是暨南大學資管系俞旭升老師所撰寫的 C 語言教學網頁講議「電腦內部運作」該章中『虛擬機器的指令集』一節,這次解釋的是 JUMP/SKIP 這兩個控制程式流程的指令。
請讀者特別注意的是,文章提到的指令集裡的十一個指令及其運作,是為了教學說明而減化過的,雖說概念上大致是相同的,但與實際上電腦真正使用的指令集運作方式,還是有所差別。
若您對詳細的技術細節有興趣,可參考維基百科的 Instruction Set 條目。
第三章、密秘指令 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,第二十和四十格沒有變,這樣對吧?」
「深夏同學有沒有發現程式執行完之後,會有什麼有趣的事呢?!」
「啊!第六十格一定會是第二十格的絕對值對吧?!」
「叮咚叮咚~~答對囉!小深夏!這下補考一定可以考個四十分左右的啦!」
「咦?!真的嗎?!」
重點複習
- 程式執行的順序是由 Program Counter 決定
- 電腦不知道過去也不知道未來,只知道當下的記憶體與暫存器的狀態
- 透過類似 JUMP / SKIP 這種指令,我們可以讓程式流程依資料的不同產生變化
回響