5.4 实例

最后让我们用第 2 章的典型程序来练习一下吧:

TinyC:

  1. #include "for_gcc_build.hh" // only for gcc, TinyC will ignore it.
  2.  
  3. int main() {
  4. int i;
  5. i = 0;
  6. while (i < 10) {
  7. i = i + 1;
  8. if (i == 3 || i == 5) {
  9. continue;
  10. }
  11. if (i == 8) {
  12. break;
  13. }
  14. print("%d! = %d", i, factor(i));
  15. }
  16. return 0;
  17. }
  18.  
  19. int factor(int n) {
  20. if (n < 2) {
  21. return 1;
  22. }
  23. return n * factor(n - 1);
  24. }

Pcode:

  1. ; int main() {
  2. FUNC @main:
  3.  
  4. ; int i;
  5. var i
  6.  
  7. ; i = 0;
  8. push 0
  9. pop i
  10.  
  11.  
  12. ; while (i < 10) {
  13. _beg_while:
  14.  
  15. push i
  16. push 10
  17. cmplt
  18.  
  19. jz _end_while
  20.  
  21. ; i = i + 1;
  22. push i
  23. push 1
  24. add
  25. pop i
  26.  
  27. ; if (i == 3 || i == 5) {
  28. _beg_if1:
  29.  
  30. push i
  31. push 3
  32. cmpeq
  33. push i
  34. push 5
  35. cmpeq
  36. or
  37.  
  38. jz _end_if1
  39.  
  40. ; continue;
  41. jmp _beg_while
  42.  
  43. ; }
  44. _end_if1:
  45.  
  46. ; if (i == 8) {
  47. _beg_if2:
  48.  
  49. push i
  50. push 8
  51. cmpeq
  52.  
  53. jz _end_if2
  54.  
  55. ; break;
  56. jmp _end_while
  57.  
  58. ; }
  59. _end_if2:
  60.  
  61. ; print("%d! = %d", i, factor(i));
  62. push i
  63. push i
  64. $factor
  65. print "%d! = %d"
  66.  
  67. ; }
  68. jmp _beg_while
  69. _end_while:
  70.  
  71. ; return 0;
  72. ret 0
  73.  
  74. ; }
  75. ENDFUNC
  76.  
  77. ; int factor(int n) {
  78. FUNC @factor:
  79. arg n
  80.  
  81. ; if (n < 2) {
  82. _beg_if3:
  83.  
  84. push n
  85. push 2
  86. cmplt
  87.  
  88. jz _end_if3
  89.  
  90. ; return 1;
  91. ret 1
  92.  
  93. ; }
  94. _end_if3:
  95.  
  96. ; return n * factor(n - 1);
  97. push n
  98. push n
  99. push 1
  100. sub
  101. $factor
  102. mul
  103. ret ~
  104.  
  105. ; }
  106. ENDFUNC

够长把,写完后是不是觉得很累?将以上代码另存为 factor.asm,存在终端当前目录(此目录中需有 pysim.py 文件),在终端中输入:

  1. $ python pysim.py factor.asm -a

注意以上最后的命令行参数是 -a。输出:

  1. 1! = 1
  2. 2! = 2
  3. 4! = 24
  4. 6! = 720
  5. 7! = 5040

那个 -a 是干什么用的?让我们改成 -da 看看:

  1. $ python pysim.py factor.asm -da

终端内容如下:images/jfactor.png图5.1 factor.asm程序单步执行界面

可以看到在模拟器自动在程序的第 1 、 2 行添加了 $mainexit ~,这就是 -a-da 的作用。这样模拟器就会默认以 main 函数为入口了。

第 5 章完