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,則輸出它; 否則什麼都不做。簡單設計一個演算法,就是
指令位址 | 組合語言 | 機器碼 |
---|---|---|
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 變成了測試 >= 我們將會修改
習題