在C中,确保为多个代码段修复了汇编指令的数量

时间:2011-07-18 18:16:07

标签: c assembly goto dispatch vm-implementation

在我正在编写的虚拟机中,我希望能够以类似于以下伪代码的方式调度命令。

add: reg[memory[pc+1]] =  reg[memory[pc+1]] + reg[memory[pc+2]]; pc += 2; goto done;
sub: reg[memory[pc+1]] =  reg[memory[pc+1]] - reg[memory[pc+2]]; pc += 2; goto done;
cmp: /* Would take more space than simply x = x + y; */ goto done;

for(int pc = 0; memory[pc] != END; pc++) {
    goto currentPositionInMemorySomehow + (memory[pc] * lengthOfInstruction);
    done:
}

其中memory是包含字节码的数组,pc是程序计数器。但要做到这一点,我们要求跳转到的每个位置在下一个块之前具有完全相同的指令数。除非有一个很棒的平台无关的汇编代码,否则不能选择下载到汇编代码,这样就可以使用相同的代码并编译到Linux,Mac和Windows。无论每个处理器都坐在上面。任何和所有的帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

虽然我不知道如何实现您想要的(并且我知道允许计算跳转的唯一编译器是gcc),但我建议您只使用switch,这是最理想的优化编译器将转换为跳转表或计算跳转,以适合您平台的方式正确处理指令对齐。

答案 1 :(得分:2)

您似乎想要编写一些C代码,这些代码将编译为独立于目标平台的可执行代码。这简直是​​一个不切实际的目标。