查表指令(2条)举例——mcs51单片机汇编语言
扫描二维码
随时随地手机看文章
查表指令(2条)
这组指令的功能是对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式:
MOVC A,@A+DPTR;((A))+(DPTR)→(A) 表格地址单元中的内容送到累加器A中
MOVC A,@A+PC;((PC))+1→(A),((A))+(PC)→(A) 表格地址单元中的内容送到累加器A中
本指令是将ROM的数据送入A中,本指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格。
说明:
1、此条指令引出了一个特殊的寻址方式,即变址寻址,在上节课时我们已进行过讲解,本指令是要在ROM的一个地址单元中找出数据,显然必须知道这个单元的地址,这个单元的地址是这样确定的:在执行本指令立脚点DPTR中有一个数,A中有一个数,执行指令时,将A和DPTR中的数加起来,就成为要查找单元的地址。
2、查找到的结果被放在A中,因此,本条指令执行前后,A中的值不一定相同。
例:有一个数在R0中,要求用查表的方法确定它的平方值(此数的取值范围是0-5)
MOV DPTR,#TABLE
MOV A,R0
MOVC A,@A+DPTR
TABLE:DB 0,1,4,9,16,25
设R0中的值为2,送入A中,而DPTR中的值则为TABLE,则最终确定的ROM单元的地址就是TABLE+2,也就是到这个单元中去取数,取到的是4,显然它正是2的平方。其它数据也可以类推
标号的真实含义:从这个地方也可以看到另一个问题,我们使用了标号来替代具体的单元地址。事实上,标号的真实含义就是地址数值。在这里它代表了0,1,4,9,16,25这几个数据在ROM中存放的起点位置。我们经常看到的指令,如LCALL DELAY指令中,DELAY则代表了以DELAY为标号的那段程序在ROM中存放的起始地址。事实上,CPU正是通过这个地址才找到这段程序的。
可以通过以下的例子再来看看标号的含义:
MOV DPTR,#100H
MOV A,R0
MOVC A,@A+DPTR
.....
ORG 0100H
DB 0,1,4,9,16,25
如果R0中的值为2,则最终地址为100H+2为102H,到102H单元中找到的是4。这样应看明白了吧?
那么为什么不这样写程序,要用标号呢?不是增加疑惑吗?
如果这样写程序的话,在写程序时,我们就必须确定这张表格在ROM中的具体的位置,如果写完程序后,又想在这段程序前插入一段程序,那么这张表格的位置就又要改变了,要改为ORG 100H这句话了,我们是经常需要修改程序的,那么麻烦,所以就用标号来替代,只要一编译程序,位置就自动发生变化,我们把这个麻烦的事交给计算机去做了。