【发布时间】:2022-01-23 18:43:31
【问题描述】:
你好,我不知道为什么在 add 指令中我需要和 7 这是 Add 指令的 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 源 2
这个 0b111(十进制的 7)如何发挥作用?为什么?
【问题讨论】:
-
当从一个单词中提取一个位域(这里是一条指令)时,你需要单独使用它,并且右对齐,这样它就可以成为一个正常的数字,你可以用它来索引一个数组。掩码可以先行,然后是移位,但这会使掩码在数值上更大,因此通常首选此顺序。或者,单词可以先左后右移动;这也将隔离感兴趣的位,使值正确。左移优先方法还允许通过算术右移进行符号扩展。