Assembly AVR汇编为什么LDI指令只能使用R16-R31寄存器

Assembly AVR汇编为什么LDI指令只能使用R16-R31寄存器,assembly,cpu-architecture,avr,Assembly,Cpu Architecture,Avr,您好,我在过去的一篇论文中遇到了这个问题,我感到困惑,到目前为止,还没有任何研究给我一个结论性的答案,因为大多数人只是说这是处理器的局限性。我很确定我们没有在课堂上讨论这个问题 有人知道原因吗?简单的答案是,LDI仅支持上16个寄存器 当您查看ISA(指令集体系结构)时,您会注意到同样的情况也适用于SUBI、SBCI、ANDI、ORI和CPI,每种指令集体系结构都需要操作码表中的12位:8位用于立即数,4位用于编码R16中的哪一个。。。R31是目的地。这意味着,仅为这6条指令提供即时信息,您就已

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


有人知道原因吗?

简单的答案是,
LDI
仅支持上16个寄存器

当您查看ISA(指令集体系结构)时,您会注意到同样的情况也适用于
SUBI
SBCI
ANDI
ORI
CPI
,每种指令集体系结构都需要操作码表中的12位:8位用于立即数,4位用于编码R16中的哪一个。。。R31是目的地。这意味着,仅为这6条指令提供即时信息,您就已经占用了37.5%的操作码

支持R0。。。R31仅对6条指令就需要75%的操作码:所有AVR操作码都是16位操作码(除了
LDS
STS
CALL
JMP
,它们都是32位的),并且您只能用16位编码这么多指令

以以下2-reg说明为例:
ADD
ADC
SUB
SBC
CP
CPC
OR
EOR
LSR
ASR
ROR
MOV
。这13条指令中的每一条都占用2^(5+5)个操作码,因为每一条指令都必须对2^5个可能的源寄存器和目标寄存器中的一个进行编码,总计占操作码空间的20%以上。我们还没有考虑跳过(<代码> RJMP ,<代码> RCALL < /代码>,分支)或内存访问,如<代码> LDD ,<代码> STD ,<代码> ,<代码> OUT/<代码>。p>
术语:上面的“操作码”是指编码一条特定机器指令所需的所有位

没有其他答案。他们决定允许完全8位立即数,并使用4位操作码,为寄存器操作数保留4位,这意味着只能寻址16位。设计人员选择了R16-31。不仅是LDI,还有其他在8位立即数上运行的指令。只有16位,没有比这更好的了。4位用于操作码,4位用于寄存器字段,其余8位用于立即数[@Jester我想你所写的(即使是最后一句话)将符合该考试的正确答案。这与“这是处理器的限制”完全不同答案)对于工程师来说很明显的事情对于学生来说可能不那么明显。我投票结束这个问题,因为它是关于硬件设计及其伴随的指令集。术语:操作码是指令的一部分,决定它是哪一条指令,与操作数分开。我们已经有了这个指令的名称整个指令,这就是“指令”。使用术语“操作码”来表示整个编码有时已经完成,但当您想要区分指令编码中的哪些位意味着什么时,就会产生混淆。