5.3 控制和循环语句

if 和 while 语句利用 jz 和 jmp 命令就可以实现,首先看 if 语句:

TinyC:

  1. if (a > 0) {
  2. print("a is a positive number");
  3. } else {
  4. print("a is a negative number");
  5. }

Pcode:

  1. _beg_if:
  2.  
  3. ; test expression
  4. push a
  5. push 0
  6. cmpgt
  7.  
  8. jz _else
  9.  
  10. ; statements when test is true
  11. print "a is a positive number"
  12.  
  13. jmp _end_if
  14. _else:
  15.  
  16. ; statements when test is false
  17. print "a is a negative number"
  18.  
  19. _end_if:

可以看出上述 Pcode 有固定的结构型式,将测试语句和两个执行体翻译成 Pcode 放到相对应的地方即可。

再来看 while 语句:

TinyC:

  1. while (a > 0) {
  2. a = a - 1;
  3. }

Pcode:

  1. _beg_while:
  2.  
  3. ; test expression
  4. push a
  5. push 0
  6. cmpgt
  7.  
  8. jz _endwhile
  9.  
  10. ; statements when test is true
  11. push a
  12. push 1
  13. sub
  14. pop a
  15.  
  16. jmp _beg_while
  17. _end_while:

结构也很简单,将测试语句和执行体翻译成 Pcode 放到相对应的地方即可。

continue 和 break 呢?将 continue 换成 jmp _beg_while,break 换成 jmp _end_while 就可以啦。

对于有多个 if / while ,以及有嵌套 if / while 语句,就要注意对同一个 if / while 语句块使用同一个Label,不同的语句块的 Label 不能冲突,continue 和 break 要 jmp 到正确的 Label ,这些工作人工来做显然很困难也容易出错,留给我们的 TinyC 编译器吧。