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的行都是我没有得到的部分。
指令是这样的:
- 15-12 位操作码 (0001)
- 11-9 位目标寄存器
- 8-6 位源 1
- 位 5 0 或 1(立即模式)
- 位 4-3 无
- 位 2-0 source2
这个 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
,或者正是我们希望提取的三个位。
你好,我不明白为什么在添加指令中我需要和 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的行都是我没有得到的部分。 指令是这样的:
- 15-12 位操作码 (0001)
- 11-9 位目标寄存器
- 8-6 位源 1
- 位 5 0 或 1(立即模式)
- 位 4-3 无
- 位 2-0 source2
这个 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
,或者正是我们希望提取的三个位。