C函数变量赋值

C函数变量赋值,c,function,hex,C,Function,Hex,我在学习如何制作虚拟机时发现了这段代码。但我不知道这个函数是做什么的。你们知道这个函数在做什么吗 void decode( int instr ) { instrNum = (instr & 0xF000) >> 12; reg1 = (instr & 0xF00 ) >> 8; reg2 = (instr & 0xF0 ) >> 4; reg3 = (instr & 0xF ); imm

我在学习如何制作虚拟机时发现了这段代码。但我不知道这个函数是做什么的。你们知道这个函数在做什么吗

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

变量
instr
=1。

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

此函数将变量
instr
中的特定4位集(调用)保存到其他变量
instrNum
reg1
等中(这些其他变量必须具有全局范围,因为此处未定义)

例如,考虑
instr
是否为
0x1234

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
获取最后一个字节
&
>
是位运算符,用于分离位和位。

为什么要保存这些是任何人的猜测,我们需要知道这些变量是什么类型以及它们的用途,但这就是正在发生的事情。这个函数似乎将指令
instr
解码为4位指令代码(
instNum
),以及多达三个寄存器的4位代码(
reg1
reg3
)。在您的虚拟机中,似乎还存在立即8位操作数(
imm
)的编码。下面是我对VM的16位指令集的猜测的示例:


绝对不是“每个字节”,你指的是“半字节”因为这些是4位字段。在学习如何制作虚拟机之前,先学习C语言ant不是运算符。Google和wikipedia可能会有所帮助。感谢大家的回答!我不可能要求更好的回答!你的最后一句话是什么意思?你们给出的所有答案都很好!我真的了解发生了什么事很抱歉,但我可以再问一个问题吗?创建虚拟机时,您是否必须将指令编码为1和0,或者直接使用某种形式的自定义汇编代码解释指令是否有任何错误?