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

2020-01-06 13:14:08丽君

现在,POP指令能够工作了!我们刚刚做的只是把栈顶放到变量val_popped里,接着栈顶指针减一。如果我们首先栈顶减一,那么将得到一些无效值,因为sp可能取值为0,那么我们可能把stack[-1]赋给val_popped,通常这不是一个好主意。

最后是ADD指令。这条指令可能要花费你一些脑细胞,同时这也是我们需要用大括号{}实现case语句内作用域的原因。

 

 
  1. case ADD: {  // 首先我们出栈,把数值存入变量a 
  2. int a = stack[sp--];   
  3. // 接着我们出栈,把数值存入变量b   
  4. // 接着两个变量相加,再把结果入栈  int result = a + b; 
  5. sp++; // 栈顶加1 **放在赋值之前**  stack[sp] = result; // 设置栈顶值 
  6.   // 完成! 
  7. break;  } 

寄存器

寄存器是虚拟机中的选配件,很容易实现。之前提到过我们可能需要六个寄存器:A,B,C,D,E和F。和实现指令集一样,我们也用一个枚举来实现它们。

 

 
  1. typedef enum {  A, B, C, D, E, F, 
  2. NUM_OF_REGISTERS  } Registers;