我如何从C中的32位序列的立即部分获取值?

时间:2015-10-28 09:56:06

标签: c stack opcode vm-implementation

我在C中构建了一个虚拟机。为此,我有了指令

pushc <const>

我将命令和值保存在32位中。前8位用于命令,其余用于值。

8位 - &gt;操作码 24位 - &gt;即时价值

为此,我制作一个宏

#define PUSHC 1 //1 is for the command value in the Opcode
#define IMMEDIATE(x) ((x) & 0x00FFFFFF)

更新:

**#define SIGN_EXTEND(i) ((i) & 0x00800000 ? (i) | 0xFF000000 : (i))** 

然后我加载以在unsigned int数组中测试它:

更新

unsigned int code[] = { (PUSHC << 24 | IMMEDIATE(2)),
                        (PUSHC << 24 | SIGN_EXTEND(-2)),
                         ...};

稍后在我的代码中我想获取pushc命令的Immediate值并将此值推送到堆栈...

我从数组中获取每个指令(IR)并构建我的堆栈。

更新

 void exec(unsigned int IR){

      unsigned int opcode = (IR >> 24) & 0xff;
      unsigned int imm = (IR & 0xffffff);

     switch(opcode){
       case PUSHC: {
         stack[sp] = imm;
         sp = sp + 1;
         break;
}
}

    ...

    }
    }

1 个答案:

答案 0 :(得分:3)

只需使用按位AND屏蔽低24位,然后在case中使用它:

const uint8_t opcode = (IR >> 24) & 0xff;
const uint32_t imm = (IR & 0xffffff);
switch(opcode)
{
  case PUSHC:
    stack[sp] = imm;
    break;
}

我转移了操作码的提取,使case更容易阅读。