Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C中32位序列的直接部分获取值?_C_Stack_Opcode_Vm Implementation - Fatal编程技术网

如何从C中32位序列的直接部分获取值?

如何从C中32位序列的直接部分获取值?,c,stack,opcode,vm-implementation,C,Stack,Opcode,Vm Implementation,我用C语言构建了一个虚拟机,我有这个指令 pushc <const> 更新: **#define SIGN_EXTEND(i) ((i) & 0x00800000 ? (i) | 0xFF000000 : (i))** 然后在无符号整数数组中加载测试: 更新: unsigned int code[] = { (PUSHC << 24 | IMMEDIATE(2)), (PUSHC << 24 | S

我用C语言构建了一个虚拟机,我有这个指令

pushc <const>
更新:

**#define SIGN_EXTEND(i) ((i) & 0x00800000 ? (i) | 0xFF000000 : (i))** 
然后在无符号整数数组中加载测试:

更新:

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

    ...

    }
    }

只需使用按位
屏蔽较低的24位,然后在
案例中使用它

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

我改变了对操作码的提取,以使
案例更易于阅读。

值是多少?我不知道understand@Tarasov抱歉,被您的代码愚弄了。:)现在从
IR
中提取这两个部分。谢谢它的工作…你给我展示了一个更好的方法…我想制作2^24并计算它们…但是你的方法更好:D但是你知道负值是什么,如何-2或-3?:/@塔拉索夫,你需要做一些工作才能使负值起作用,你需要决定立即数是有符号的还是无符号的。如果它是有符号的,你需要对顶部的位进行符号扩展(基本上是将位23复制到位24..31)(
const uint8_t opcode = (IR >> 24) & 0xff;
const uint32_t imm = (IR & 0xffffff);
switch(opcode)
{
  case PUSHC:
    stack[sp] = imm;
    break;
}