用C语言来实现一个简单的虚拟机

2020-01-06 13:14:08丽君
  • stack[sp] = program[++ip];  break; 
  • }  } 
  • 现在你看到,它和我们之前实现的eval()函数有一些不同。首先,我们把每个case语句块放到大括号里。你可能不太了解这种用法,它可以让你在每条case的作用域里定义变量。虽然现在不需要定义变量,但将来会用到。并且它可以很容易得让所有的case语句块保持一致的风格。

    其次是神奇的表达式program[++ip]。它做了什么?呃,我们的程序存储在一个数组里,PSH指令需要获得一个操作数。操作数本质是一个参数,就像当你调用一个函数时,你可以给它传递一个参数。这种情况我们称作压栈数值5。我们可以通过增加指令指针(译者注:一般也叫做程序计数器)ip来获取操作数。当ip为0时,这意味着执行到了PSH指令,接下来我们希望取得下一条指令——即压栈的数值。这可以通过ip自增的方法实现(注意:增加ip的位置十分重要,我们希望在取得指令前自增,否则我们只是拿到了PSH指令),接下来需要跳到下一条指令否则会引发奇怪的错误。当然我们也可以把sp++简化到stack[++sp]里。

    对于POP指令,实现非常简单。只需要减小栈顶指针,但是我一般希望能够在出栈的时候打印出栈值。

    我省略了实现其它指令的代码和swtich语句,仅列出POP指令的实现:

     

     
    1. // 记得#include <stdio.h>!   
    2. case POP: {  int val_popped = stack[sp--]; 
    3. printf("popped %dn", val_popped);  break;