Swa*_*Tel -2 microcontroller assembly avr instruction-set risc
可以将立即值(即任何整数)加载或复制到AVR微控制器中的通用寄存器(R0到R30)中,但为什么除GPR之外我们不能将立即值加载到SRAM中?
我对此并不是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)翻译成机器语言.
归档时间: |
|
查看次数: |
495 次 |
最近记录: |