C奇怪的函数变量赋值

时间:2014-02-17 13:01:25

标签: c function hex

我在学习如何制作虚拟机时发现了这段代码。但我不知道这个功能是做什么的。你们中的任何人都知道这个功能在做什么吗?

void decode( int instr )
{
instrNum = (instr & 0xF000) >> 12;
reg1     = (instr & 0xF00 ) >>  8;
reg2     = (instr & 0xF0  ) >>  4;
reg3     = (instr & 0xF   );
imm      = (instr & 0xFF  );
}

变量instr = 1。

3 个答案:

答案 0 :(得分:1)

那些是bit operations,它们通常用于在一个整数中紧凑地存储一些标志。此函数从参数instr“读取”位并将结果写入其他字段。

答案 1 :(得分:1)

该函数将特定的4位(称为nibbles)从变量instr保存到其他变量instrNumreg1等(这些其他变量必须具有这里没有定义全局范围。)

例如,考虑instr0x1234

instrNum = (0x1234 & 0xF000) >> 12; 
         = (0x1000) >> 12;
         = 1      
reg1 = (0x1234 & 0xF00) >> 8;
     = (0x0200) >> 8;
     = 2
reg2 = (0x1234 & 0xF0) >> 4;
     = (0x0030) >> 4;
     = 3
reg3 = (0x1234 & 0xF);
     = (0x0004);
     = 4
imm = (0x1234 & 0xFF);
     = (0x0034);
     = 52

所以它取变量instr的每个半字节并将其保存到一个单独的变量中。最后一个变量imm获取最后一个字节。 &>>是位运算符,AND operator用于分隔位和right shift operator
为什么它保存这些是任何人的猜测,我们需要知道这些变量是什么类型以及它们用于什么类型,但那正在发生什么

答案 2 :(得分:1)

此函数似乎将指令instr解码为4位指令代码(instNum),最多三个寄存器4位代码(reg1至{{1} })。在您的虚拟机中,似乎还有一个直接8位操作数(reg3)的编码。这里是我对VM的16位指令集的猜测的例证:

enter image description here