前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >51单片机查表指令

51单片机查表指令

作者头像
用户4645519
发布2020-09-07 10:59:11
8240
发布2020-09-07 10:59:11
举报
文章被收录于专栏:嵌入式学习

51单片机具有两条查表指令,用于从 ROM 中读出预存的数据:

MOVC A, @A + PC MOVC A, @A + DPTR 问题:在“MOVC A,@A+DPTR”和“MOVC A,@A+PC”中,分别使用了DPTR和PC作基址,请问这两个基址代表什么地址?使用中有何不同? 答案: 使用@A+DPTR基址变址寻址时,DPTR为常数且是表格的首地址,A为从表格首址到被访问字节地址的偏移量。 使用@A+PC基址变址寻址时,PC仍是下条指令首地址,而A则是从下条指令首地址到常数表格中的被访问字节的偏移量。

PC是程序计数器,DPTR是数据指针。用这个MOVC A,@A+DPTR比较方便的,DPTR是16位。范围广。建议使用。

这两条都是查表指令,MOVC A,@A+PC,只能给累加器A赋值,所以只能查这条指令所在地址以后256字节范围内的代码或常数。 而MOVC A,@A+DPTR,可以给DPTR赋给任何一个16位的地址值,所以查表范围可达整个程序存储器64K字节空间的代码或常数。

其中前一条指令的用法,比较难,使用的时候,需要计算一个“偏移量”。不了解“指令的字节数”的人,都不清楚应该如何计算。 做而论道曾在以前的文章中,介绍过“偏移量”的自动计算方法,可见如下链接:

-------------------- 最佳答案: 51单片机汇编语言有一条查表指令是: MOVC A, @A + DPTR 它不是单独使用的,要和 DB 伪指令配套使用。

例如:若累加器A中有一个0~9的数,请用查表法求出该数的平方值,设平方表表头地址为1000H。 程序如下: ;------------------------------------- MOV DPTR, #1000H MOVC A, @A + DPTR ……

ORG 1000H DB 0, 1, 4, 9, 16, 25...... ;------------------------------------- DB 伪指令从 ROM 1000H 开始,顺序存放了一系列的“平方”数据。 MOVC A, @A+DPTR 指令中的A,如果等于0,就会在“平方”数据中取出第0个,就是0; MOVC A, @A+DPTR 指令中的A,如果等于1,就会在“平方”数据中取出第1个,就是1; MOVC A, @A+DPTR 指令中的A,如果等于2,就会在“平方”数据中取出第2个,就是4; MOVC A, @A+DPTR 指令中的A,如果等于3,就会在“平方”数据中取出第3个,就是9; …… MOVC A, @A+DPTR 指令中的A,如果等于9,就会在“平方”数据中取出第9个,就是81。 ------------------------------- 后记: 这条指令的用法,相对前一条就简单了,事先并不需要计算“偏移量”。但是这条指令必须要使用寄存器DPTR。

大家知道,凡是涉及到片外RAM存储单元的时候,基本上都要使用DPTR,这个DPTR寄存器通常是比较“繁忙”的,它形成了一个片内、片外之间,数据传传输的“瓶颈”。因此在读取ROM数据的时候,能够不用这后一条指令,就不要用它,应该尽量使用前一条指令。 ==============================================================

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/08/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档