具体方法是:将表首地址放入DPTR中,偏移量放入A中,用查表指令MOVC A,@A+DPTR来完成从数据区取数。有如下几种情况:
1、如果数据区的长度不超过256个字节(累加器A的容量之内),且数据是单字节的,则不需要另外处理;
2、因为如果数据区的长度不超过256个字节,但数据是双字节的,需要将偏移量乘2,第一次读出一个字节保存,将地址加1后再读第二字节(类推:一个数据是n字节,则偏移量乘n,每次读出一个字节保存,将地址加1后再读下一字节,直到一个数全部读出)。
3、如果数据区的长度超过了256个字节,因为A已经存放不了256以上的偏移量,此时需要事先将偏移量加入到DPTR中去(即数据的真实地址全部放到DPTR中了),再将A清零后使用查表指令。同样也要如上区分单字节数和多字节数。
你所给例就是数据区的长度超过了256个字节,且数据为双字节的情况。程序解释如下,供参考。
MOV DPTR,#TAB ;表首地址入DPTR
MOV A,R3
CLR C
RLC A ;偏移量的低8位乘2在A中,移出的最高位在C中
XCH A,R2 ;乘2后的偏移量的低8入R2中,偏移量的高8位入A中
RLC A;偏移量的高8位乘2在A中
XCH A,R2 ;偏移量的高低字节归位,至此完成了偏移量乘2
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,R2
MOV DPH,A;将偏移量加到DPTR中,至此DPTR中就是数据第一个字节的实际地址
CLR A ;A清零,因为偏移量已经加入,DPTR内容不需要再修正。
MOVC A,@A+DPTR读数据第一个字节
MOV R2,A读数据第一个字节存入R2中
CLR A ;A清零
INC DPTR ;地址加“1”,准备读下一个字节
MOVC A,@A+DPTR
MOV R3,A 读数据第一个字节存入R3中
RET
TAB: DW XXXXHTAB为表首地址,共1024个双字节数据项,共2048个字节
DW XXXXH
......
DW XXXXH
LTB2:-------------------下面是R2R3乘以2
MOV A, R3
CLR C
RLC A
MOV R3, A
XCH A, R2
RLC A
XCH R2, A
------------------下面是表首地址加上R2R3
MOV DPTR, #TAB2
ADD A, DPL (R2R3)+(DPTR)→(DPTR)
MOV DPL, A
MOV A, DPH
ADDC A, R2
MOV DPH, A
------------------下面是查表,查出两个字节
CLR A
MOVC A, @A + DPTR
MOV R2,A
CLR A
INC DPTR
MOVC A, @A + DPTR
MOV R3,A
RET
----
这个程序,是根据两个字节的数据来查表,查出的,也是两个字节。
如果先弄懂了一个字节的查表程序,看这个程序,也就没有什么难的了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)