可以在AVR微控制器中将立即值(即任何整数)加载或复制到通用寄存器(R0到R30)中,但为什么我们不能将除了GPR之外的立即值加载到SRAM中?
答案 0 :(得分:5)
我对此并不是100%肯定,但从我的研究和经验来看,这就是我得到的。
AVR架构的大部分指令(如果不是全部)都使用16位Opcode *。这意味着该命令必须仅使用16位来指定命令的操作和操作数。 涉及立即常量的命令(ANDI,ORI,LDI,CPI,SBR,CBR,SUBI,SBCI等)必须在操作码中保持8位的恒定值。操作码的操作通常也使用4位来定义。所以我们只剩下总共16位中的4位。通过4位,我们可以获得总共16位数的范围。这是AVR控制器的一半寄存器。这就是为什么你只能使用32个寄存器中的16个。
选择上半部分对我来说也是一个谜。我可以想到两个原因 1.某些指令(如MUL)将低位寄存器R1:R0绑定为结果寄存器 2.使用间接寻址(0-63之间的常数)的指针寄存器占据前6个寄存器(R26-R31)。
让我向您展示一些示例,以使Opcode更加清晰。
ADD - Add without carry
Operation: Rd <- Rd + Rr
Opcode: 0000 11rd dddd rrrr
Description: We got five 'd' and five 'r'. With five bits you can get a total of 32 values. Which means that you can use any register available.
Example:
ADD R5, R20.
Rd = R5 = 5 = 0 0101
Rr = R20 = 20 = 1 0100
The opcode would look like this
0000 1110 0101 0100
*************************************
LDI - Load Immediate
Operation: Rd <- K
Opcode: 1110 KKKK dddd KKKK
Description: We got eight 'K' and four 'd'.
Example:
LDI R18, 100
Rd = R18 = 18-16=2 = 0010
K = 100 = 100 = 0110 0100
The opcode would look like this
1110 0110 0010 0100
来源: http://www.microchip.com/webdoc/avrassembler/avrassembler.wb_instruction_list.html
* Opcode是机器语言中命令的二进制表示。简而言之,它是处理器真正理解的语言。编译器的工作是将人类可以轻松理解的语言(如C)翻译成机器语言。
答案 1 :(得分:3)
大多数RISC机器都是load/store machines:AVR,MIPS,SPARC,PowerPC,我认为是ARM。每条指令至少有一个寄存器操作数,访问(数据)存储器的唯一指令是带有寄存器dst / src的加载/存储指令。
存储指令中的immediates的任何空间用于在寻址模式中立即移位,而不是立即数据。
请记住,AVR指令是固定宽度的,与x86不同,其中How,are,you doing,today?
可以对目标使用任意寻址模式(对于ModRM + SIB + disp32使用最多6个字节),对于立即数使用4个字节。另外还有1个字节用于操作码。