【问题标题】:AVR Assembly why does LDI instruction can only use R16 - R31 registersAVR 汇编为什么 LDI 指令只能使用 R16 - R31 寄存器
【发布时间】:2020-04-21 14:23:28
【问题描述】:

您好,我在过去的一篇论文中遇到了这个考试问题,我很困惑,到目前为止,还没有研究给我一个确凿的答案,因为大多数人只是说这是处理器的限制。我很确定我们没有在课堂上讲过这个。

有人知道为什么吗?

【问题讨论】:

  • 没有其他答案。他们决定允许完整的 8 位立即数和 4 位操作码,为寄存器操作数留下 4 位,这意味着只能寻址 16 个。设计师选择了 R16-31。
  • 不仅是 LDI,还有其他在 8 位立即数上运行的指令。只有 16 位,没有什么比这更好的了。 4 位用于操作码,4 位用于寄存器字段,其余 8 位用于立即数[
  • @Jester 我认为您所写的内容(即使没有最后一句)也可以作为该考试的正确答案。而且它与仅仅“它是处理器的限制”的答案完全不同))对工程师来说显而易见的事情对学生来说可能并不那么明显。
  • 我投票结束这个问题,因为它是关于硬件设计及其伴随的指令集。

标签: assembly cpu-architecture avr


【解决方案1】:

简单的答案是,LDI 只支持高 16 个寄存器。

当您查看 ISA(指令集架构)时,您会注意到这同样适用于 SUBISBCIANDIORICPI,每个需要 12操作码表中的位:8 位用于 8 位立即数,4 位用于编码 R16...R31 中的哪一个是目标。也就是说,仅仅提供这 6 条指令,就已经占用了 37.5% 的操作码。

支持 R0...R31 需要 75% 的操作码仅用于 6 条指令:所有 AVR 操作码都是 16 位操作码(LDSSTSCALLJMP 除外,它们是 32 位) ,而你只能用 16 位编码这么多指令

以以下 2-reg 指令为例:ADDADCSUBSBCCPCPCANDANDOREOR、@ 987654341@、ASRRORMOV。这 13 条指令中的每一条都占用 2^(5+5) 个操作码,因为每条指令都必须对 2^5 个可能的源寄存器和目标寄存器中的一个进行编码,总计超过 20% 的操作码空间。我们还没有考虑跳转(RJMPRCALL、分支)或内存访问,如LDDSTDINOUT

术语:上面的“操作码”是指编码一个特定机器指令所需的所有位。

【讨论】:

  • 术语:操作码是指令的一部分,它决定了它是哪条指令,与操作数分开。我们已经为整个指令起了一个名字,那就是“指令”。 en.wikipedia.org/wiki/Opcode。有时使用术语“操作码”来表示整个编码已经完成,但是当您想要区分指令编码中的哪些位意味着什么时,它会令人困惑。
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 2015-11-01
  • 2021-01-16
  • 2019-03-17
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多