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

发布者:北极星小鹏最新更新时间:2017-01-05 来源: eefocus关键字:AVR汇编  指令  汇编系统 手机看文章 扫描二维码
随时随地手机看文章

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

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

AVR单片机的CPU内核结构

如上两图,左图是虚线框内AVR 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位)为一个存储单元的。

ATmega16单片机的程序计数器为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汇编  指令  汇编系统 引用地址:AVR汇编初探之二《AVR的指令与汇编系统》

上一篇:AVR汇编初探之一《AVR单片机的CPU内部结构》
下一篇:AVR单片机外部RAM访问

推荐阅读最新更新时间:2024-03-16 15:28

从0学ARM-GNU伪指令、代码编译,lds使用
一、MDK和GNU伪指令区别 我们在学习汇编代码的时候经过会看到以下两种风格的代码: gnu代码开头是: .global _start _start: @汇编入口 ldr sp,=0x41000000.end @汇编程序结束 MDK代码开头是: AREA Example,CODE,READONLY ;声明代码段Example ENTRY ;程序入口 Start MOV R0,#0 OVER END 这两种风格的代码是要使用不同的编译器,我们之前的实例代码都是MDK风格的。 那么多对于我们初学者来说要学习哪种风的呢? 答案是肯定的,学习GNU风格的汇编代码,因为做Li
[单片机]
从0学ARM-GNU伪<font color='red'>指令</font>、代码编译,lds使用
PIC单片机常用指令介绍与指令功能分类表
  源程序的编写主要就是用这些基本的指令实现你的控制任务。但为了增加源程序的可读性和可维护性,我们引入了伪指令的概念。伪指令本身不会产生可执行的汇编指令,但它们可以帮组“管理”你编写的程序,其实用性和必要性绝不亚于 35 条正真的汇编指令。我们在此着重介绍最常用的几种伪指令。   PIC单片机最常用的几种指令介绍   #include 或 include   #include 伪指令的作用是把另外一个文件的内容全部包含复制到本伪指令所在的位置。被包含复制的文件可以是任何形式的文本文件,当然文件中的内容和语法结构必须是MPASM 能够识别的。最经常被“include”的是针对 PIC 单片机内部特殊功能寄存器定义的包 含 头
[单片机]
第1天-ARM汇编指令MOV/MVN
MOV : 传送 (Move) MOV{条件}{S} , dest = op_1 MOV 从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。你可以指定相同的寄存器来实现 NOP 指令的效果,你还可以专门移位一个寄存器: MOV R0, R0 ; R0 = R0... NOP 指令 MOV R0, R0, LSL#3 ; R0 = R0 * 8 如果 R15 是目的寄存器,将修改程序计数器或标志。这用于返回到调用代码,方法是把连接寄存器的内容传送到 R15: MOV PC, R14 ; 退出到调用者 MOVS PC, R14 ;
[单片机]
MCS-51 指令系统中所用符号说明——单片机原理学习笔记 4
涉及操作数的指令 Rn:工作寄存器,R0~R7中的一个。(定位在RAM空间上) #data:8位立即数,实际使用时data是00H~FFH中的一个。 direct:8位直接地址,实际使用时direct是00H~FFH中的一个,也可以是特殊寄存器SFR中的一个。(定位在片内RAM的00H~FFH中) @Ri:表示寄存器间接寻址,Ri中存放的是真实操作数的地址,并非操作数。Ri只能是R0和R1。(定位在PSW中的R0、R1) #data16:16位立即数。 @DPTR:表示以DPTR为数据指针的间接寻址,存放16位寄存器的地址,用于对片外64K RAM/ROM寻址。 bit:位地址,可以是00H~FFH中的
[单片机]
PLC指令的验证实验和操作数的步骤
  PLC指令的验证实验是测试和验证PLC的编程程序是否正确的过程。通过这个实验,可以检测出PLC程序中是否存在逻辑错误、语法错误和硬件问题等问题。   验证实验通常分为两个部分:软件仿真和硬件测试。在软件仿真过程中,可以使用软件仿真器模拟实际工厂设备和场景,检测程序运行是否正确。在硬件测试过程中,将PLC程序加载到实际PLC设备中,并测试设备的输入和输出是否正确。通过这些测试,可以确保PLC程序可以正常运行,从而保证工业自动化生产过程的高效性和可靠性。   PLC指令的验证实验通常包括以下步骤:   1. 确定需求和设计PLC程序。   2. 编写PLC指令,并将其上传至PLC。   3. 配置输入和输出设备,例如传感器
[嵌入式]
51单片机汇编指令
0、 ALTNAME 功能: 这一伪指令用来自定义名字,以替换源程序中原来的保留字,替换的保留字均可等效地用于子程序中。 格式: ALTNAME 保留字 自定义名 注意: 自定义名与保留字之间首字符必须相同。 1、BIT 功能:指令用于将一个位地址赋给指定的符号名。 指令格式:符号名 BIT 位地址经BIT 指令定义过的位符号名不能更改。 例如:X_ON BIT 60H ;定义一个绝对位地址 X_OFF BIT 24h.2 ;定义一个绝对位地址 BIT---定义位命令 格式: 字符名称 BIT 位地址 功能用于给字符名称
[单片机]
移动指令和运算指令
移动指令 mov 寄存器,数据 mov ax,10H mov 寄存器,寄存器 mov ax,bx mov 寄存器,内存单元 mov ax,ds: 取字型数据 mov al,ds: 取字节型数据 mov 内存单元,寄存器 mov ds: ,ax mov 段寄存器,寄存器 mov bx,1000H → mov ds,bx mov 寄存器,段寄存器 mov bx,ds 注: mov ds,数据H 是错误的赋值方式 例如: mov ds,1000H 运算指令 add 寄存器,数据 add ax,1 add 寄存器,寄存器 add ax,bx add 寄存器,内存单元
[单片机]
SDRAM通用控制器的FPGA模块化设计
引言 同步动态随机存储器(SDRAM),在同一个CPU时钟周期内即可完成数据的访问和刷新,其数据传输速度远远大于传统的数据存储器(DRAM),被广泛的应用于高速数据传输系统中。基于FPGA的SDRAM控制器,以其可靠性高、可移植性强、易于集成的特点,已逐渐取代了以往的专用控制器芯片而成为主流解决方案。然而,SDRAM复杂的控制逻辑和要求严格的时序,成为开发过程中困扰设计人员主要因素,进而降低了开发速度,而且大多数的基于FPGA的SDRAM控制器都是针对特定的SDRAM芯片进行设计,无法实现控制器的通用性。本文介绍一种通用SDRAM控制器的FPGA模块化解决方案。 SDRAM控制逻辑复杂,命令种类多样,需要周期性刷新操作、行列
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved