历史上的今天
返回首页

历史上的今天

今天是: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

推荐阅读

史海拾趣

Anvo-Systems公司的发展小趣事

Anvo-Systems公司自成立以来,一直致力于电子技术的研发与创新。某年,公司成功研发出一款具有高效能源利用率的智能家居控制系统,该产品迅速在市场上获得了广泛关注。通过不断优化产品性能和用户体验,Anvo-Systems逐步扩大了市场份额,并与多家知名家电品牌建立了合作关系。这一技术突破不仅提升了公司的知名度,也为公司的持续发展奠定了坚实基础。

EOREX公司的发展小趣事

在电子行业竞争日益激烈的背景下,EOREX公司敏锐地洞察到智能家居市场的巨大潜力。他们及时调整战略方向,将研发重心转向智能家居领域,推出了一系列具有创新性和实用性的智能家居产品。同时,EOREX还积极布局全球市场,通过与海外企业的合作与交流,不断引进先进的技术和设计理念,提升自身的竞争力。这些举措使得EOREX在智能家居领域迅速崛起,成为行业内的佼佼者。

Green Power Solutions公司的发展小趣事
一旦发现故障或异常情况,应及时停机检查并维修,避免故障扩大影响设备安全。
ABB Group公司的发展小趣事
可能是由于控制电路故障、磁放大器调整不当或电源电压波动过大等原因。
Evans Capacitor Company公司的发展小趣事

在国内市场取得成功后,ECC开始将目光投向国际市场。公司积极参加国际展会,与海外客户建立联系。同时,ECC还在海外设立了研发中心和生产基地,以便更好地了解当地市场需求并提供定制化服务。通过不懈的努力,ECC的产品成功打入国际市场,实现了全球化布局。

Alpha (Taiwan)公司的发展小趣事

随着数字化时代的到来,Alpha (Taiwan)公司紧跟时代步伐,积极推动数字化转型。公司引进先进的数字化设备和技术,对生产线进行智能化改造,提高了生产效率和产品质量。同时,公司还加强了对大数据、云计算等技术的应用,实现了对市场需求、客户反馈等信息的实时分析和处理。这些数字化转型的举措,不仅提升了公司的竞争力,也为公司的未来发展奠定了坚实的基础。

请注意,这些故事是基于一般情况和行业趋势构建的,并非Alpha (Taiwan)公司的实际经历。要了解Alpha (Taiwan)公司的真实发展故事,建议查阅相关公司的官方资料、新闻报道或行业分析报告。

问答坊 | AI 解惑

十天学会AVR视频教程

第一讲:开发板和软件的操作使用 1、 介绍配件。 2、 安装软件(ICC AVR 和AVR STUDIO)及其使用,包括新建工程、程序下载,仿真调试;整板测试;板上资源。 3、 着重介绍一下USB接口的仿真器。 第二讲:AVR单片机的概述和C语言的基础知识 ...…

查看全部问答>

嵌入式CAN总线控制器与DSP的接口

现场总线是一种开放式、 数字化、多点通信的控制系统局域网络, 是当今自动化领域中最具有应用前景的技术之一。CAN总线是现场总线中的应用热点,CAN总线支持分布式控制和适时控制的串行通信网络。   由于CAN总线具有通信速率高、开放性好、报文短 ...…

查看全部问答>

DS2-电力载波通讯PLC

DS2-电力载波通讯PLC   什么是电力载波通讯PLC技术?   电力载波通讯PLC(英文:Power line communication)是电力系统特有的通信方式,电力载波通讯是指利用现有电力线,通过载波方式将模拟或数字信号进行高速传输的技术。最大特点是不需要重 ...…

查看全部问答>

单片机破解的常用方法及应对策略

单片机破解的常用方法及应对策略…

查看全部问答>

如何在驱动中创建虚拟串口与USB通信???

最近要在原来的板子上添加3G模块,用的是中兴的MC8630,但该模块的AT指令是通过串口来发送接收的,而相关的数据信息是通过USB来进行的 如此一来,我们是这样设想的:在原来的板子上模拟一个虚拟串口来接收上层的AT指令,然后该虚拟串口再把接收到的指令 ...…

查看全部问答>

wince 下mfc变成如何改变常规定时器的优先级

小弟最近在用mfc编程。用常规定时器定时接收串口中的数据,但是当我点击界面中其它按钮的时候,接收到的串口数据有丢失现象。请问可不可以把常规定时器的优先级设高一些,让其它如鼠标消息的优先级设低一些,从而使接收数据不丢失。 …

查看全部问答>

sd卡的 RCA作用

小弟目前正在研究SD卡协议相关,对CMD3的Response中的RCA不是很理解,不知道具体作用是做什么的,与读写卡操作时的逻辑地址,物理地址有什么样的关系?…

查看全部问答>

通用寄存器和cpu内部寄存器的区别是?

通用寄存器和cpu内部寄存器的区别是?…

查看全部问答>

05.30【每日一问】break和return

while (( ptr_temp != ptr) && ptr_temp )    {   for ( i = 0; i < 9; i++ )   {    if ( ptr_temp->Card_nunmber     != R_d_ram )  & ...…

查看全部问答>