状态寄存器包含了最近执行的算术指令的结果信息。这些信息可以用来改变程序流程以实现条件操作。如指令集所述,所有ALU运算都将影响状态寄存器的内容。这样,在许多情况下就不需要专门的比较指令了,从而使系统运行更快速,代码效率更高。
在进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢复。这些工作需要软件来处理。
状态标志位的作用很大,每一位都代表着不同含义。许多指令的运行将对寄存器中的某些位置1或清零,它反映了CPU运算、操作结果的状态。与SREG中的位操作有关的指令有置1、清零、为1转移、为0转移等,AVR的状态寄存器SREG在I/O空间的地址为$3F($005F),其各标志位的意义如表2-1所示。
表2-1 SREG寄存器各标志位的意义
●位7——I:全局中断使能位
该标志位为AVR中断总控制开关,当I位被置位1时,表示CPU可以响应中断请求,而当I位被清0,则所有的中断被禁止,CPU不响应任何的中断请求。除了该标志位用于AVR中断的总控制,各个单独的中断触发控制还由其所在的中断屏蔽寄存器(GIMSK、TIMSK)控制。如果全局中断触发寄存器被清0,则全局(所有的)中断被禁止,但单独的中断触发控制在GIMSK和TIMSK中的值保持不变。在中断发生后,I位由硬件清除,并由RETI(中断返回)指令置位,从而允许子序列的中断响应。
●位6——T:位复制存储
位复制指令BLD和BST使用T标志位作为源和目标。通用寄存器组中任何一个寄存器中的一位可以通过BST指令被复制到T中,而用BLD指令则可将T中的位值复制到通用寄存器组中的任何一个寄存器的一位中。
●位5——H:半进位标志位
半进位标志位H表示在一些运算操作过程中有无半进位(低四位向高四位进、借位)的产生,该标志对于BCD码的运算和处理非常有用。
●位4——S:符号标志位,(www.xing528.com)
S位是负数标志位N和2的补码溢出标志位V两者“异或”值。在正常运算条件下(V=0,不溢出)S=N,即运算结果最高位作为符号是正确的。而当产生溢出时V=1,此时N已不能正确指示运算结果的正负,但还是正确的。对于单(或多)字节有符号数据,执行减法或比较操作后,S标志能正确指示参与相减或比较的两个数的大小。
●位3——V:2补码溢出标志位
2的补码溢出标志位V,支持2的补码运算,为模2补码加、减运算溢出标志。溢出表示运算结果超过了正数(或负数)所能表示的范围。加法溢出表现为正+正=负,或负+负=正;减法溢出表现为正-负=负,或负-正=正。溢出时,运算结果最高位(N)取反才是真正的结果符号。
●位2——N:负数标志位
负数标志位直接取自运算结果的最高位,N=1时表示运算结果为负,否则为正。但发生溢出时不能表示真实的结果(见上面对溢出标志位的说明)。
●位1——Z:零值标志位
零值标志位表明在CPU运算和逻辑操作之后,其结果是否为零,当Z=1表示结果为零。
●位0——C:进/借位标志位
进/借位标志位表明在CPU的运算和逻辑操作过程中有无发生进/借位。
以上这些标志位非常重要,对运算结果的判断处理,要以相应的标志位为依据。标志位也是分支、循环控制的依据。采用汇编编写程序时,要注意指令对标志位的影响,以及正确使用判断指令。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。