How I get the value from the Immediate part of a 32 Bit sequence in C?

谁说胖子不能爱 提交于 2019-12-11 11:58:09

问题


I built a virtual machine in C. And for this I have the Instruction

pushc <const>

I saved the command and the value in 32 Bit. The First 8 Bit are for the command and the rest for the value.

8 Bit -> Opcode 24 Bit -> Immediate value

For this I make a macro

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

UPDATE:

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

Then I load for testing this in a unsigned int array:

Update:

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

later in my code I want to get the Immediate value of the pushc command and push this value to a stack...

I get every Instruction (IR) from the array and built my stack.

UPDATE:

 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:


Just use a bitwise AND to mask out the lower 24 bits, then use it in the case:

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

I shifted around the extraction of the opcode to make the case easier to read.



来源:https://stackoverflow.com/questions/33387875/how-i-get-the-value-from-the-immediate-part-of-a-32-bit-sequence-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!