BCC16VM 教材:流程控制--if

BCC15VM 提供三個流程控制指令:

等到讀者掌握這三個指令之後,就會明白,程式語言中所有的流程控制語法,包括 全都可以用上述三個指令完成!

首先,我們想想,一般程式語言的邏輯算子都有六種,以 C 為例:

==   !=   >   <   >=   <=
怎麼會翻譯成機器碼只要兩個呢? 其實可以。首先,==!= 只是邏輯相反, 要測試 != 的 True 等於測試 == 的 False, 而 != 的 False 等於 == 的 True。 所以其實都能用 test equal 來解決。 同理,><= 邏輯相反, 所以都能用 test larger 來解決。 最後,< 只不過是 > 的另一種寫法: 如果想要探測 x < y,改寫成 y > x 不也一樣? 因此,<>= 也就都能用 test larger 來解決了。

Test larger 達到流程控制的手法是,如果測試 True, 則令 PC <- PC+1,也就是讓 CPU 執行下一個機器碼; 否則,若測試 False,則令 PC <- PC+2, 也就是讓 CPU 執行下二個機器碼。 再配合 goto,就能達到流程控制的效果。

我們從一個最基本的例子開始。 寫一個程式,如果 0000 的數值 <=6,則輸出它; 否則什麼都不做。簡單設計一個演算法,就是

這個演算法幾乎已經可以實現,只差『> 6』怎麼辦? 其實 CPU 不能直接做這個動作,必須先『產生 6』,放在暫存器, 然後比較兩個暫存器。因此,程式實現如下。

指令位址組合語言機器碼
0000  load R0 0 10100000
0001  generate 6 01010110
0010  test larger R0 R2 01100010
0011  stop 00000000
0100  print R0 00001010
0101  stop 00000000

【注意】BCC16VM 有錯,test larger 變成了測試 >= 我們將會修改

習題

  1. 自己輸入數值到 0000,並設定 PC00000000, 實驗本節所寫的程式。
  2. 寫一個程式,如果 0000 的數值 !=0 就輸出它的值, 否則什麼都不做。
[BCC16-B]
單維彰 (2004/06/10) ---
[Prev] [Next] [Up]