lc3的虚拟机

virtual machine for lc3

你好,我不明白为什么在添加指令中我需要和 7 这是添加指令的 cpp 代码

uint16_t dr = (instr >> 9) & 0b111;
                uint16_t sr1 = (instr >> 6) & 0b111;
                uint16_t sr2 = instr & 0b111;

                uint16_t second = registers[sr2];
                uint16_t immediateFlag = (instr >> 5) & 0b1;
                if (immediateFlag) {
                    uint16_t imm5 = instr & 0b11111;
                    second = signExtend(imm5, 5);
                }

                registers[dr] = registers[sr1] + second;

所有加7的行都是我没有得到的部分。 指令是这样的:

这个 0b111(十进制的 7)是如何起作用的,为什么?

看看第一行代码:它尝试解码目标寄存器,它位于您输入数字的第 9-11 位。

假设instr有16位abcdefgh ijklmnop,那么我们要提取第9-11位,即efg:
instr >> 9 将所有内容右移 9 位,但答案仍然有 16 位:00000000 0abcdefg.
& 0b111& 0b00000000 00000111 的 shorthand,因此将其应用于 instr >> 9 会导致 00000000 00000efg,或者正是我们希望提取的三个位。