我在学习如何制作虚拟机时发现了这段代码。但我不知道这个功能是做什么的。你们中的任何人都知道这个功能在做什么吗?
void decode( int instr )
{
instrNum = (instr & 0xF000) >> 12;
reg1 = (instr & 0xF00 ) >> 8;
reg2 = (instr & 0xF0 ) >> 4;
reg3 = (instr & 0xF );
imm = (instr & 0xFF );
}
变量instr
= 1。
答案 0 :(得分:1)
那些是bit operations,它们通常用于在一个整数中紧凑地存储一些标志。此函数从参数instr
“读取”位并将结果写入其他字段。
答案 1 :(得分:1)
该函数将特定的4位(称为nibbles)从变量instr
保存到其他变量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
获取最后一个字节。 &
和>>
是位运算符,AND
operator用于分隔位和right shift operator。
为什么它保存这些是任何人的猜测,我们需要知道这些变量是什么类型以及它们用于什么类型,但那正在发生什么
答案 2 :(得分:1)
此函数似乎将指令instr
解码为4位指令代码(instNum
),最多三个寄存器4位代码(reg1
至{{1} })。在您的虚拟机中,似乎还有一个直接8位操作数(reg3
)的编码。这里是我对VM的16位指令集的猜测的例证: