5.3 控制和循环语句
if 和 while 语句利用 jz 和 jmp 命令就可以实现,首先看 if 语句:
TinyC:
- if (a > 0) {
- print("a is a positive number");
- } else {
- print("a is a negative number");
- }
Pcode:
- _beg_if:
- ; test expression
- push a
- push 0
- cmpgt
- jz _else
- ; statements when test is true
- print "a is a positive number"
- jmp _end_if
- _else:
- ; statements when test is false
- print "a is a negative number"
- _end_if:
可以看出上述 Pcode 有固定的结构型式,将测试语句和两个执行体翻译成 Pcode 放到相对应的地方即可。
再来看 while 语句:
TinyC:
- while (a > 0) {
- a = a - 1;
- }
Pcode:
- _beg_while:
- ; test expression
- push a
- push 0
- cmpgt
- jz _endwhile
- ; statements when test is true
- push a
- push 1
- sub
- pop a
- jmp _beg_while
- _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 编译器吧。