BCC16VM 教材:流程控制--if-else

繼續前一節,我們用 test larger 和 goto 來示範 if-else 之流程控制。

寫一個程式,如果 0000 的數值 > 6,則輸出 1; 否則輸出 0。達成任務的演算法非常簡單,就是

但是,要實現這個演算法,有兩個問題:
  1. 這個問題較小:就是 CPU 並不能直接輸出 0 或 1,而是要『產生』0 和 1 放在暫存器裡面,然後再輸入。
  2. 這個問題嚴重:如果 test larger 為真,CPU 執行下一個指令, 但是要輸出 1 起碼也得兩個指令,更何況輸出之後要 stop, 故需三個指令。但是我們不能在 test larger 之下寫三個屬於 True 的指令, 因為萬一 test larger 為 False,則 CPU 要執行下面第二個指令。
解決問題的辦法,就是用 goto。如下。

指令位址組合語言機器碼
0000  load R0 0 10100000
0001  generate 6 01010110
0010  test larger R0 R2 01100010
0011  goto 6 10000110
0100  generate 0 01010000
0101  print R2 00001100
0110  stop 00000000
0111  generate 1 01010001
1000  print R2 00001100
1001  stop 00000000

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

在上述程式裡面,如果 test larger 為真,則跳到後面的機器碼去做那三句指令。 如果 test larger 為否,則從下面第二個指令開始做起。 上述程式用了 10 個機器碼。如果善用 goto,還可以節省一個機器碼。如下。

指令位址記號機器碼
0000  load R0 0 10100000
0001  generate 6 01010110
0010  test larger R0 R2 01100010
0011  goto 5 10000101
0100  generate 0 01010000
0101  goto 6 10000110
0110  generate 1 00000000
0111  print R2 00001100
1000  stop 00000000

在執行速度很慢的機器上,或者記憶體很少的機器上, 程式設計師或許值得花心思去節省一個機器碼。 但是一般而言,方便就好。

習題

  1. 寫一個程式,如果 0000 的數值 == 0 則輸出 1,否則輸出 0。
  2. 寫一個程式,如果 0000 的數值 >= 6 則輸出 1,否則輸出 0。
  3. 寫一個程式,如果 0000 的數值 <= 7 就輸出它的值,否則輸出它減去 7 的值。
[BCC16-B]
單維彰 (2004/06/10) ---
[Prev] [Next] [Up]