C语言 谁能给我解释一下在这种情况下这种转变意味着什么:指令集

xbp102n0  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(125)

我尝试写一个VM(LC-3),在这个ADD指令上我遇到了这样的语句。基本上“register 0”是DR寄存器,但我真的不明白什么是移位,为什么是9。还有带有0x 7值的AND运算符。

|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|    0001   |  DR   | SR1 |0| 00| SR2 |

谁能给我详细解释一下吗?

ADD {
    /* destination register (DR) */
    uint16_t r0 = (instr >> 9) & 0x7;
    /* first operand (SR1) */
    uint16_t r1 = (instr >> 6) & 0x7;
    /* whether we are in immediate mode */
    uint16_t imm_flag = (instr >> 5) & 0x1;
    if (imm_flag) {
        uint16_t imm5 = sign_extend(instr & 0x1F, 5);
        reg[r0] = reg[r1] + imm5;
    } else {
        uint16_t r2 = instr & 0x7;
        reg[r0] = reg[r1] + reg[r2];
    }
    update_flags(r0);
}
6yoyoihd

6yoyoihd1#

它所做的是隔离代表DR寄存器的3位,使它们成为一个独立的数字。
假设整个序列如下所示:

1110101101101011
    ^^^
     DR

右移9位得到:

1110101

& 0x7(按位与)隔离3个最低位:

101

执行类似的操作以隔离SR1和立即模式标志的值。根据该标志,也可能需要SR2,但由于它已经在最低3位中,因此不需要移位。

相关问题