为什么我们无法在AVR微控制器中将立即值加载到SRAM中?

Swa*_*Tel -2 microcontroller assembly avr instruction-set risc

可以将立即值(即任何整数)加载或复制到AVR微控制器中的通用寄存器(R0到R30)中,但为什么除GPR之外我们不能将立即值加载到SRAM中?

Thy*_*osK 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
Run Code Online (Sandbox Code Playgroud)

资料来源:http: //www.microchip.com/webdoc/avrassembler/avrassembler.wb_instruction_list.html

*操作码是机器语言中命令的二进制表示.简而言之,它是处理器真正理解的语言.编译器的工作是将人类可以轻松理解的语言(如C)翻译成机器语言.