关于单片机查表指令时用RLC左移指令

题目:设表格中有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

刚学单片机汇编语言,不知道为什么要用RLC A 我看有什么说 因为楼主的要求是要在两个寄存器之间移位
两者不能独立地移
所以需要一个C进位位过度 这是怎么过度的啊 谁能详细的说下这个程序啊

【1】表格中存放了1024个数据,编号0-1023项。每个数据2个字节。
【2】R3,R2,构成16位的编号。二进制格式。编号为x。
【3】第x项的数据起始地址应为 TAB+(2*x)。
【4】2*x,其实就是左移一次x。由于x是16位的。但51没有16位循环左移指令。
【5】借助于A,利用带进位位循环左移RLC A指令,完成R3,R2左移一次。其中,低位的R2部分,左移时,R2最高位借助于Cy进位位补足到R3的最低位。

理解一下RLC A这条指令的功能,影响的标志位就可以了。追问

【3】第x项的数据起始地址应为 TAB+(2*x)这个是什么意思是啊,初学单片机不知道这是怎么读表的

追答

这个与单片机无关诶。
由于表格在存储器当中通常是顺序存放的,8位宽存储器最小单元是字节,每个数据项又是双字节。根据表格索引号x,和表格的起始地址TAB,就可以得到x对应数据项的存放地址TAB+(x乘以2)。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-17
MOV DPTR,#TAB
MOV A,R3 ; 如R2R3 = 0292H = 0000 0010 1001 0010 ( 十进制 658 )
CLR C ; C =0 A= 1001 0010
RLC A ; A = 0010 0100 C = 1 ( 左移一位)
XCH A,R2 ; A <=> R2 A = 0000 0010 C=1
RLC A ; A = 0000 0101 C = 0 ( 左移一位)
XCH AR2 ; A <=> R2 R2=0000 0101 A = 0010 0100 ( 十六进制 0524H)
ADD A,DPL ; ( 十进制 1316)
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本回答被网友采纳
相似回答