MSC-51单片机指令中的查表问题
题目:设表格中有1024个数据项,每个数据为2个字节,表格总长度为2048个字节,现要求根据R2R3的内容从表格中找出对应的数据元素的值,并送回到R2R3中。(他上面说是...
题目:设表格中有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
本人新手,此段代码楞是搞不明白是什么意思
忘高手详解,谢谢 展开
程序如下:
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
本人新手,此段代码楞是搞不明白是什么意思
忘高手详解,谢谢 展开
2个回答
展开全部
查表程序是要从一个专门的数据区内找到你所需要的那个数。这个数在表中的位置,由表首地址、数在表内相对表首地址的偏移量、一个数据的字节数等因素来确定。
具体方法是:将表首地址放入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 XXXXH;TAB为表首地址,共1024个双字节数据项,共2048个字节
DW XXXXH
......
DW XXXXH
具体方法是:将表首地址放入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 XXXXH;TAB为表首地址,共1024个双字节数据项,共2048个字节
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.
基本思路是从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.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询