1.ALU(算述逻辑单元)
AVR ALU与32个通用工作寄存器直接相连。寄存器与寄存器之间、寄存器与立即数之间的ALU运算只需要一个时钟周期。ALU操作分为3类:算术、逻辑和位操作。此外,还提供了支持无/有符号数和分数乘法的乘法器。
2.状态寄存器
状态寄存器包含了最近执行的算术指令的结果信息。这些信息可以用来改变程序流程以实现条件操作。状态寄存器的内容只有在ALU运算结束后才会更新。这样在多数情况下就不需要专门的比较指令了,从而使系统运行更快速,代码效率更高。
在进入中断例程时状态寄存器不会自动保存,中断返回时也不会自动恢复。这些工作需要软件来处理。
AVR中断寄存器SREG的定义如下:
>Bit 7——l:全局中断使能
置位时使能全局中断。单独的中断使能由其他独立的控制寄存器控制。如果I清零,则不论单独中断标志置位与否,都不会产生中断。任意一个中断发生后I清零,而执行RETl指令后1置位以使能中断。l也可以通过SEl和CLl指令来置位和清零。
>Bit 6——T:位复制存储
位复制指令BLD和BST利用T作为目的或源地址。BST把寄存器的某一位复制到T,而BLD把T复制到寄存器的某一位。
>Bit 5——H:半进位标志
半进位标志H表示算术操作发生了半进位。此标志对于BCD运算非常有用。
>Bit 4——S:符号位,S—N①V
S为负数标志N与2的补码溢出标志V的“异或"。
>Bit 3——V:2的补码溢出标志
支持2的补码运算。
4 >Bit 2——N:负数标志
表明算术或逻辑操作结果为负。
>Bit l——2:零标志
表明算术或逻辑操作结果为零。
>Bit 0——C:进位标志
表明算术或逻辑操作发生了进位。
3.通用工作寄存器组
寄存器文件针对AVR增强型RISC指令集做了优化。为了获得需要的性能和灵活性,寄存器文件支持以下的输入/输出方案:
一个8位输出操作数和一个8位结果输人;
两个8位位输出操作数和一个8位结果输入;
两个8位位输出操作数和一个l 6位结果输入;
一个l6位位输出操作数和一个l6位结果输入。
大多数操作寄存器文件的指令都可以直接访问所有的寄存器,而且多数的执行时间为单时钟周期。
图2—4为CPU的32个通用工作寄存器的结构。其中,每个寄存器都有一个数据内存地址,将它们直接映射到用户数据空间的头32个地址。虽然寄存器文件的物理实现不是SRAM.这种内存组织方式在访问寄存器方面具有极大的灵活性,因为X、Y、Z寄存器可以设置为指向任意寄存器的指针。
4.X、Y和Z地址指针寄存器
寄存器R26----R3 1除了用作通用寄存器外,还可以作为用于数据间接寻址的地址指针。这3个间接寻址寄存器如图2—5所示。
在不同的寻址模式中,这些地址寄存器可以实现固定偏移量,自动加l和自动减l功能。
5.堆栈指针寄存器SP
堆栈指针主要用来保存临时数据、局部变量和中断/自程序的返回地址。堆栈指针总是指向堆栈的顶部。要注意AVR的堆栈是向下生长的,即新数据推人堆栈时堆栈指针的数值将减小。
堆栈指针指向位于SRAM的函数及中断堆栈。堆栈空间必须在调用函数或中断使能之前定义。指针必须指向高于$60的地址。用PUSH指令推数据入栈时,堆栈指针将减1;而当调用函数或中断时,指针将减2。使用POP指令时,堆栈指针将加l;而用RET或RETl返回时.指针将加2。
AVR堆栈指针占用了I/O空间两个8位寄存器,使用的位数由实际情况决定。注意,在AVR结构中某些操作使用的数据空间很小,只要SPL即可,此时不会给出SPH寄存器。
6.RAM页面的Z选择寄存器RAMPZ
>Bits 7~2——Res:保留
保留位,读操作时返回值为零;在写数据时要写入0,以保证与未来产品的兼容。
>Bit l——RAMPZ0:扩展RAM页面2指针
RAMPZ寄存器用于选择Z指针访问的是哪一个64 KB RAM。由于ATmegal28不支持超过64 KB的存储器,因此RAMPZ只用来协助ELPM/SPM指令决定访问哪一个程序存储器页。不同的RAMPZ0的作用如下:
RAMPZ0—0 ELPM/SPM可以访问程序存储器地址$0000~$7FFF(低64 KB)
RAMPZ0—1 ELPM/SPM可以访问程序存储器地址$8000~$FFFF(高64 KB)
注意:LPM不受RAMPZ设置的影响。
电子街推荐阅读: