MSC-51单片机指令中的查表问题

来源:百度知道 编辑:UC知道 时间:2024/05/29 07:46:45
题目:设表格中有1024个数据项,每个数据为2个字节,表格总长度为2048个字节,现要求根据R2R3的内容从表格中找出对应的数据元素的值,并送回到R2R3中。(他上面说是利用DPH,DPL进行运算的方法进行查表)
程序如下:
MOV DPTR,#TAB
MOV A,R3
CLR C
RLC A
XCH A,R2
RLC A
XCH AR2
ADD A,DPL
MOV DPL,A;调整DPL,DPH
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
TAB: DW XXXXH;共1024个数据项
DW XXXXH
......
DW XXXXH

本人新手,此段代码楞是搞不明白是什么意思
忘高手详解,谢谢

我的分析不一定对,仅供参考。
基本思路是从R2R3处取偏移量,乘以2(每个数据为2个字节)通过A加给DPTR,R2加给DPL,r3加给DPH,再从DPTR处取数,交给A,再给R2R3.
MOV DPTR,#TAB 表的首地址给DPTR
MOV A,R3 r3的值给A
CLR C C置零
RLC A A乘2(左移一位后补零)
XCH A,R2 A和r2交换数值
RLC A A左移一位,即乘2
XCH A,R2 A和r2交换。至此,相当于R3乘2后给了R2,r2里存的是r3.乘2后的数,A里是r2乘2后的数。
ADD A,DPL DPL的值加给A
MOV DPL,A;调整DPL,DPH 相当于把原r2里的数乘2当做偏移地址加给DPL
MOV A,DPH
ADDC A,R2
MOV DPH,A 相当于把原r3里的数乘2当做偏移地址加给DPH
CLR A
MOVC A,@A+DPTR;查表
MOV R2,A;第一字节
CLR A
INC DPTR
MOVC A,@A+DPTR;查第二字节
MOV R3,A
RET
TAB: DW XXXXH;共1024个数据项
DW XXXXH
......
DW XXXXH
因为查表的数字是双字节,所以低位给r2,高位给r3.

查表程序是要从一个专门的数据区内找到你所需要的那个数。这个数在表中的位置,由表首地址、数在表内相对表首地址的偏移量、一个数据的字节数等因素来确定。
具体方法是:将表首地址放入DPTR中,偏移量放入A中,用查表指令MOVC A,@A+DPTR;来完成从数据区取数。有如下几种情况:
1、如果数据区的长度不超过256个字节(累加器A的容量之内),且数据是单字节的,则不需要另外处理;
2、因为如果数据区的长度不超过256个字节,但数据是双字节的,需要将偏移量乘2,第一次读出一个字节保存,将地址加1后再读第二字节(类推:一个数据是n字节,则偏移量乘n,每次读出一个字节保存