【问题标题】:virtual machine for lc3lc3的虚拟机
【发布时间】: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)如何发挥作用?为什么?

【问题讨论】:

  • 当从一个单词中提取一个位域(这里是一条指令)时,你需要单独使用它,并且右对齐,这样它就可以成为一个正常的数字,你可以用它来索引一个数组。掩码可以先行,然后是移位,但这会使掩码在数值上更大,因此通常首选此顺序。或者,单词可以先左后右移动;这也将隔离感兴趣的位,使值正确。左移优先方法还允许通过算术右移进行符号扩展。

标签: c++ assembly lc3


【解决方案1】:

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

假设instr有16位abcdefgh ijklmnop,那么我们要提取位9-11,即efg:
instr >> 9将所有内容向右移动9位,但答案仍然有16 位:00000000 0abcdefg
& 0b111& 0b00000000 00000111 的简写,因此将其应用于instr >> 9 会得到00000000 00000efg,或者恰好是我们希望提取的三位。

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2020-07-25
    • 2011-06-18
    • 2010-10-07
    • 2016-03-14
    • 2013-01-14
    相关资源
    最近更新 更多