5.4 实例
最后让我们用第 2 章的典型程序来练习一下吧:
TinyC:
- #include "for_gcc_build.hh" // only for gcc, TinyC will ignore it.
- int main() {
- int i;
- i = 0;
- while (i < 10) {
- i = i + 1;
- if (i == 3 || i == 5) {
- continue;
- }
- if (i == 8) {
- break;
- }
- print("%d! = %d", i, factor(i));
- }
- return 0;
- }
- int factor(int n) {
- if (n < 2) {
- return 1;
- }
- return n * factor(n - 1);
- }
Pcode:
- ; int main() {
- FUNC @main:
- ; int i;
- var i
- ; i = 0;
- push 0
- pop i
- ; while (i < 10) {
- _beg_while:
- push i
- push 10
- cmplt
- jz _end_while
- ; i = i + 1;
- push i
- push 1
- add
- pop i
- ; if (i == 3 || i == 5) {
- _beg_if1:
- push i
- push 3
- cmpeq
- push i
- push 5
- cmpeq
- or
- jz _end_if1
- ; continue;
- jmp _beg_while
- ; }
- _end_if1:
- ; if (i == 8) {
- _beg_if2:
- push i
- push 8
- cmpeq
- jz _end_if2
- ; break;
- jmp _end_while
- ; }
- _end_if2:
- ; print("%d! = %d", i, factor(i));
- push i
- push i
- $factor
- print "%d! = %d"
- ; }
- jmp _beg_while
- _end_while:
- ; return 0;
- ret 0
- ; }
- ENDFUNC
- ; int factor(int n) {
- FUNC @factor:
- arg n
- ; if (n < 2) {
- _beg_if3:
- push n
- push 2
- cmplt
- jz _end_if3
- ; return 1;
- ret 1
- ; }
- _end_if3:
- ; return n * factor(n - 1);
- push n
- push n
- push 1
- sub
- $factor
- mul
- ret ~
- ; }
- ENDFUNC
够长把,写完后是不是觉得很累?将以上代码另存为 factor.asm,存在终端当前目录(此目录中需有 pysim.py 文件),在终端中输入:
- $ python pysim.py factor.asm -a
注意以上最后的命令行参数是 -a。输出:
- 1! = 1
- 2! = 2
- 4! = 24
- 6! = 720
- 7! = 5040
那个 -a 是干什么用的?让我们改成 -da 看看:
- $ python pysim.py factor.asm -da
终端内容如下:图5.1 factor.asm程序单步执行界面
可以看到在模拟器自动在程序的第 1 、 2 行添加了 $main 和 exit ~,这就是 -a 和 -da 的作用。这样模拟器就会默认以 main 函数为入口了。
第 5 章完