我尝试写一个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);
}
1条答案
按热度按时间6yoyoihd1#
它所做的是隔离代表
DR
寄存器的3位,使它们成为一个独立的数字。假设整个序列如下所示:
右移9位得到:
& 0x7
(按位与)隔离3个最低位:执行类似的操作以隔离
SR1
和立即模式标志的值。根据该标志,也可能需要SR2
,但由于它已经在最低3位中,因此不需要移位。