历史上的今天
今天是:2024年11月15日(星期五)
2019年11月15日 | AVR的指令与汇编器系统及宏指令
2019-11-15 来源:51hei
AVR单片机指令系统是RISC结构的精简指令集,CISC结构存在指令系统不等长,指令数多,CPU利用效率低,执行速度慢等缺陷。
ATmega16共有131条指令,按功能可分为五大类,它们是:
A.算术和逻辑运算指令(28 条);
B.比较和跳转指令(36 条);
C.数据传送指令(35 条);
D.位操作和位测试指令(28 条);
E.MCU控制指令(4 条)。
AVR一条指令的长度大多数为16位,还有少部分为32位。
AVR的指令的一般格式为:
![]()
操作码用于指示CPU执行何种操作,是加法还是减法,是数据传送还是数据移位。
一条指令可以只有操作码,或第一操作数。
AVR的汇编语句的格式:
(1) [标号:] 伪指令 [操作数] [;注释]
(2) [标号:] 指令 [操作数] [;注释]
1.AVR指令的寻址方式和寻址空间
指令的一个重要组成部分是操作数。指令给出参与运算数据的方式称为寻址方式。CPU执行指令时,首先要根据地址获取参加操作的操作数,然后才能对操作数进行操作,操作的结果还要根据地址保存在相应的储存器或寄存器中。
下面介绍部分AVR的部分指令及寻址方式:
(1)单寄存器寻址 例:INC Rd ;操作:Rd←Rd+1
INC R5 ;将寄存器R5内容加1回放。
(2)双寄存器寻址 例:ADD Rd, Rr ;操作:Rd←Rd+Rr
ADD R0, R1 ;将R0和R1寄存器内容相加,结果回放R0。
(3)I/O寄存器直接寻址 例:IN Rd, P ;操作:Rd←P。
IN R5, $3E ;读 I/O 空间地址为$3E寄存器(SPH)的内容,放入寄存器R5。
(4)数据存储器空间直接寻址 例:LDS Rd, K ;操作:Rd←(K)
LDS R18, $100 ;读地址为$100的SRAM中内容,传送到R18中。
(5)数据存储器空间的寄存器间接寻址 例:LD Rd, Y ;操作:Rd←(Y),把以Y为指针的SRAM的内容送Rd。
LD R16, Y ;设Y=$0567,即把SRAM地址为$0567的内容传送到R16中。
(6)程序存储器空间取常量寻址
例:LPM ;操作:R0←(Z),即把以Z为指针的程序存储器的内容送R0。
若 Z=$0100,即把地址为$0080的程序存储器的低字节内容送R0。
若 Z=$0101,即把地址为$0080的程序存储器的高字节内容送R0。
例:LPM R16, Z ;操作:R16←(Z),即把以Z为指针的程序存储器的内容送R16。
若 Z=$0100,即把地址为$0080 的程序存储器的低字节内容送R16。
若 Z=$0101,即把地址为$0080 的程序存储器的高字节内容送R16。
(7)程序存储器空间写数据寻址
例:SPM ;操作:(Z)←R1:R0,把 R1:R0 内容写入以 Z 为指针的程序存储器单元。
(8)程序存储器空间直接寻址
例:JMP $0100 ;操作:PC←$0100。程序计数器 PC 的值设置为$0100,接下来执行程序存储器$0100 单元的指令代码。
例:CALL $0100 ;操作:STACK←PC+2; SP← SP-2; PC←$0100。先将程序计数器 PC 的当前值加 2 后压进堆栈(CALL 指令为 2 个字长),堆栈指针计数器 SP 内容减 2,然后 PC 的值为$0100,接下来执行程序存储器$0100 单元的指令代码。
(9)程序存储器空间相对寻址
例:RJMP $0100 ;操作:PC←PC+1+$0100。若当前指令地址为$0200(PC=$0200),即把$0301 送程序计数器 PC,接下来执行程序存储器$0301 单元的指令代码。
例:RCALL $0100 ;操作:STACK←PC+1;SP←SP-2;PC←PC+1+$0100。若当前指令地址为$0200(PC=$0200),先将程序计数器 PC 的当前值加 1 后压进堆栈,堆栈指针计数器SP 内容减 2,然后 PC 的值为$0301,接下来执行程序存储器$0301 单元的指令代码。
(10)数据存储器空间堆栈寄存器 SP 间接寻址
例:PUSH R0 ;操作:STACK←R0;SP←SP-1。若当前 SP=$10FF,先把寄存器 R0 的内容送到 SRAM 的$10FF 单元,再将 SP 内容减 1,即 SP=$10FE。
例:POP R1 ;操作:SP←SP+1;R1←STACK。若当前 SP=$10FE,先将 SP 内容加 1,再把 SRAM 的$10FF 单元内容送到寄存器 R1,此时 SP=$10FF。
此外,在 CPU 响应中断和执行 CALL 一类的子程序调用指令(SP = SP-2),以及执行中断返回 IRET 和子程序返回 RET 一类的子程序返回指令中(SP = SP+2),都隐含着使用堆栈寄存器 SP 间接寻址的方式。
2.AVR汇编器伪指令
在汇编语言程序中可以使用一些伪指令。伪指令不属于 CPU 指令集,编译时并不产生实际的目标机器操作代码,只是用于在汇编程序中对地址、寄存器、数据、常量等进行定义说明,以及对编译过程进行某种控制等。AVR 的指令系统不包括伪指令,伪指令通常由汇编编译系统给出。

伪指令一般以 . 开头,如:
.DSEG ;RAM 数据段(SRAM) var1: .BYTE 1 ;保留 1 个字节的存储单元,用 var1 标识 table: .BYTE tab_size;保留 tab_size 个字节的存储空间 .CSEG ;代码段开始(Flash) ldi r30, low(var1) ;将保留存储单元 var1 起始地址的低 8 位装入 Z ldi r31, high(var1) ;将保留存储单元 var1 起始地址的高 8 位装入 Z ld r1, Z ;将保留存储单元的内容读到寄存器 R1
上一篇:avr单片机汇编参考程序
下一篇:avr单片机的内部结构
史海拾趣
|
第一讲:开发板和软件的操作使用 1、 介绍配件。 2、 安装软件(ICC AVR 和AVR STUDIO)及其使用,包括新建工程、程序下载,仿真调试;整板测试;板上资源。 3、 着重介绍一下USB接口的仿真器。 第二讲:AVR单片机的概述和C语言的基础知识 ...… 查看全部问答> |
|
现场总线是一种开放式、 数字化、多点通信的控制系统局域网络, 是当今自动化领域中最具有应用前景的技术之一。CAN总线是现场总线中的应用热点,CAN总线支持分布式控制和适时控制的串行通信网络。 由于CAN总线具有通信速率高、开放性好、报文短 ...… 查看全部问答> |
|
DS2-电力载波通讯PLC 什么是电力载波通讯PLC技术? 电力载波通讯PLC(英文:Power line communication)是电力系统特有的通信方式,电力载波通讯是指利用现有电力线,通过载波方式将模拟或数字信号进行高速传输的技术。最大特点是不需要重 ...… 查看全部问答> |
|
最近要在原来的板子上添加3G模块,用的是中兴的MC8630,但该模块的AT指令是通过串口来发送接收的,而相关的数据信息是通过USB来进行的 如此一来,我们是这样设想的:在原来的板子上模拟一个虚拟串口来接收上层的AT指令,然后该虚拟串口再把接收到的指令 ...… 查看全部问答> |
|
小弟最近在用mfc编程。用常规定时器定时接收串口中的数据,但是当我点击界面中其它按钮的时候,接收到的串口数据有丢失现象。请问可不可以把常规定时器的优先级设高一些,让其它如鼠标消息的优先级设低一些,从而使接收数据不丢失。 … 查看全部问答> |
|
while (( ptr_temp != ptr) && ptr_temp ) { for ( i = 0; i < 9; i++ ) { if ( ptr_temp->Card_nunmber != R_d_ram ) & ...… 查看全部问答> |




