51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > ◆学习MCU > 详细内容
[基础篇]八、寻址方式与指令系统
阅读次数:2719  字体大小: 【】 【】【

       这么斤斤计较!不就差了一个周期吗,如果是 12M 的晶振的话,也就 1 个微秒时间了,一个字节又能有多少?

       不对,如果这条指令只执行一次,也许无所谓,但一条指令如果执行上 1000 次,就是 1 毫秒,如果要执行 1000000 万次,就是 1S 的误差,这就很可观了,单片机做的是实时控制的事,所以必须如此“斤斤计较”。字节数同样如此。

       再来提一个问题,现在我们已知,寻找操作数可以通过直接给的方式(立即寻址)和直接给出数所在单元地址的方式(直接寻址),这就够了吗?

       看这个问题,要求从 30H 单元开始,取 20 个数,分别送入 A 累加器。

       就我们目前掌握的办法而言,要从 30H 单元取数,就用 MOV A , 30H ,那么下一个数呢?是 31H 单元的,怎么取呢?还是只能用 MOV A , 31H ,那么 20 个数,不是得 20 条指令才能写完吗?这里只有 20 个数,如果要送 200 个或 2000 个数,那岂不要写上 200 条或 2000 条命令 ? 这未免太笨了吧。为什么会出现这样的状况?是因为我们只会把地址写在指令中,所以就没办法了,如果我们不是把地址直接写在指令中,而是把地址放在另外一个寄存器单元中,根据这个寄存器单元中的数值决定该到哪个单元中取数据,比如,当前这个寄存器中的值是 30H ,那么就到 30H 单元中去取,如果是 31H 就到 31H 单元中去取,就可以解决这个问题了。怎么个解决法呢?既然是看的寄存器中的值,那么我们就可以通过一定的方法让这里面的值发生变化,比如取完一个数后,将这个寄存器单元中的值加 1 ,还是执行同一条指令,可是取数的对象却不一样了,不是吗。通过例子来说明吧。

MOV R7,#20

MOV R0,#30H

LOOP:MOV A,@R0

INC R0

DJNZ R7,LOOP

       这个例子中大部份指令我们是能看懂的,第一句,是将立即数 20 送到 R7 中,执行完后 R7 中的值应当是 20 。第二句是将立即数 30H 送入 R0 工作寄存器中,所以执行完后, R0 单元中的值是 30H ,第三句,这是看一下 R0 单元中是什么值,把这个值作为地址,取这个地址单元的内容送入 A 中,此时,执行这条指令的结果就相当于 MOV A , 30H 。第四句,没学过,就是把 R0 中的值加 1 ,因此执行完后, R0 中的值就是 31H ,第五句,学过,将 R7 中的值减 1 ,看是否等于 0 ,不等于 0 ,则转到标号 LOOP 处继续执行,因此,执行完这句后,将转去执行 MOV A , @R0 这句话,此时相当于执行了 MOV A , 31H (因为此时的 R0 中的值已是 31H 了),如此,直到 R7 中的值逐次相减等于 0 ,也就是循环 20 次为止,就实现了我们的要求:从 30H 单元开始将 20 个数据送入 A 中。

       这也是一种寻找数据的方法,由于数据是间接地被找到的,所以就称之为间址寻址。注意,在间址寻址中,只能用 R0 或 R1 存放等寻找的数据。

二、指令

  1. 数据传递类指令
    1) 以累加器为目的操作数的指令

    MOV A , Rn

    MOV A , direct

    MOV A , @Ri

    MOV A , #data

    第一条指令中, Rn 代表的是 R0-R7 。第二条指令中, direct 就是指的直接地址,而第三条指令中,就是我们刚才讲过的。第四条指令是将立即数 data 送到 A 中。

    下面我们通过一些例子加以说明:

    MOV A , R1 ;将工作寄存器 R1 中的值送入 A , R1 中的值保持不变。

    MOV A,30H ;将内存 30H 单元中的值送入 A , 30H 单元中的值保持不变。

    MOV A,@R1 ;先看 R1 中是什么值,把这个值作为地址,并将这个地址单元中的值送入 A 中。如执行命令前 R1 中的值为 20H ,则是将 20H 单元中的值送入 A 中。

    MOV A,#34H ;将立即数 34H 送入 A 中,执行完本条指令后, A 中的值是 34H 。

    2) 以寄存器 Rn 为目的操作的指令

    MOV Rn,A

MOV Rn,direct

MOV Rn,#data

这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。

  

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[1]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号 

51La