新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > AVR汇编初探之二《AVR的指令与汇编系统》

AVR汇编初探之二《AVR的指令与汇编系统》

作者:时间:2017-01-10来源:网络

  学单片机那么久了,感觉想要深入,还得看汇编语言,至少得了解单片机内部结构。

本文引用地址:http://www.eepw.com.cn/article/201701/342697.htm

  下面就以为例,介绍一下单片机结构和汇编语言。

  单片机的CPU内核结构

    

 

  如上两图,左图是虚线框内 CPU的内核结构,右图是AVR单片机内核结构的方框图,可以看出AVR单片机的数据总线(CPU字长)是8位的,也就说它是8位单片机。

  AVR采用了Harvard结构,具有独立的数据和程序总线,CPU在执行一条指令的同时,就将PC中指定的下一条指令取出,构成了一级流水线运行方式,实现了一个时钟周期执行一条指令,数据吞吐量高达1MIPS/MHz。

  AVR CPU内核由几个重要的部分组成,它们分别是:

  A.算数逻辑单元ALU(Arithmetic Logic Unit)

  AVR ALU与32个通用工作寄存器直接相连。寄存器与寄存器之间、寄存器与立即数之间的ALU运算只需要一个时钟周期。ALU操作分为3类:算术、逻辑和位操作,此外还提供了支持无/有符号数和分数乘法的乘法器,操作结果的状态将影响到状态寄存器SREG(Status Register)。

  B.程序计数器PC、指令寄存器和指令译码器

  程序计数器PC用来存放下一条需要执行指令在程序存储器(ROM)空间的地址(指向FlashROM空间),取出的指令存放在指令寄存器中,然后送入指令译码器中产生各种控制信号,控制CPU的运行(执行指令)。

  AVR一条指令的长度大多数为16位,还有少部分为32位,因此AVR的程序存储器结构实际上是以字(16位)为一个存储单元的。

  单片机的程序计数器为13位,正好满足了对片内8K字(及16K字节)的Flash程序存储器空间直接寻址的需要。

  C.通用寄存器General Purpose Registers

  在AVR中,由命名为R0~R31的32个8位通用工作寄存器构成一个“通用快速工作寄存器组”,为ALU提供操作数。它们的在RAM的映射空间地址是$0000~$001F,其中有6个寄存器($001A-$001F)可以合并为3个16位间接寻址寄存器指针,分别被称为X寄存器,Y寄存器,和Z寄存器,用于对数据存储器(SRAM)进行间接寻址。

  D.状态寄存器-SREG

  状态寄存器SREG是一个8位标志寄存器,用来存放指令执行后的有关状态和结果的标志,各位状态通常是在指令执行过程中自动产生的,但也可以由用户根据需要用专用指令加以改变。

    

 

  位7-I:全局中断使能位

  当I位被置位时,表示CPU可以响应中断请求,反之,则所有中断被禁止。I位可以通过SEI和CLI指令来置位和清零,在中断发生后,I位由硬件清除,并由RETI(中断返回)指令置位。

  位6-T:位拷贝存储

  位拷贝指令BLD和BST利用T作为目的或源地址。BST把寄存器的某一位拷贝到T,而BLD把T拷贝到寄存器的某一位。

  位5-H:半进位标志 半进位标志H表示算术操作发生了半进位,此标志对于BCD运算非常有用。

  位4-S:符号位 S=N⊕V,S为负数标志N与2的补码溢出标志V的异或

  位3-V:2的补码溢出标志,支持2的补码运算

  位2-N:负数标志 表明算术或逻辑操作结果为负

  位1-Z:零标志 表明算术或逻辑操作结果为零

  位0-C:进位标志 表明算术或逻辑操作发生了进位

  E.堆栈指针寄存器SP(Stack Point)

  堆栈指针主要用来保存临时数据、局部变量和中断/子程序的返回地址。堆栈指针总是指向堆栈的顶部,AVR的堆栈是向下生长的,即新的数据推入堆栈时,堆栈指针的数值将减小。

  处在I/O地址空间的&3E($005E)和$3D($005D)的两个8位寄存器构成了AVR单片机的16位堆栈指针寄存器SP,分别为SPH,SPL。

  堆栈指针指向数据SRAM堆栈区,必须指向高于0x60的地址空间,所以通常初始化时将SP的指针设在SRAM最高处。

  使用PUSH指令将数据推入堆栈时指针减一;而子程序或中断返回地址推入堆栈时指针将减二。

  使用POP指令将数据弹出堆栈时,堆栈指针加一;而用RET或RETI指令从子程序或中断返回时堆栈指针加二。



关键词: AVR ATmega16

评论

技术专区

关闭