MCS-51单片机查表程序

在片内RAM的30H起始的单元中存放2位十六进制数,将其转换为ASCⅡ码,并将其存入40H为首的片内RAM中。用查表法编写程序。
ORG 0000H
LJMP SUBRTE
ORG 1000H
SUBRTE:MOV R0 ,#30H ;置地址指针R0初值
MOV R1 ,#40H ;置地址指针R1初值
MOV R2 ,#4 ;置字节数
LOOP: MOV A ,@R0 ;取16进制数
ANL A,#0FH ;屏蔽高4位
ADD A,#16 ;
MOVC A, @A+PC ;查表低4位转换为ASCⅡ码
MOV @R1,A ;送结果
INC R1 ;修改指针
MOV A,@R0 ;从新取16进制数
SWAP A ;高4位与低4位互换
ANL A,#0FH ;取高4位
ADD A,#7
MOVC A,@A+PC ;查表高4位转换为ASCⅡ码
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP
DEC R1
RET
TABLE:DB’012345678’
DB’9ABCDEF’
END
——————————————————————
ADD A,#16 和 ADD A,#7分别是什么意思 为什么要用这两条指令
MOV A ,@R0
ANL A,#0FH
ADD A,#16
MOVC A, @A+PC
麻烦举例子说明下这四句,这四句懂了就全都懂了 谢谢

ADD A,#16和ADD A,#7都属于查表“修正”指令。这是 MOVC A,@A+PC 这条查表指令必须要用到的修正方式,所以这种修正指令的识别特征就是:它的下条要运行的指令一定是 MOVC A,@A+PC 这样作的目的就是为了当A中的数值与PC中的当前内容相加后,形成的查表地址能跟表格TABLE的首地址相对应,否则相加后形成的查表地址就会出错。具体的修正数值不是固定的(不同的人编写的指令数量不同,所以修正数值也不同,大致上可以按照每条指令占用2个字节、个别指令需要3字节,如MOVC A,@A+PC就需要3个字节这样来计算,总之这条指令使用起来很麻烦,需要提前人工计算出它的修正值。
而 MOVC A,@A+DPTR同样也是查表指令,但它就不需要人工进行计算修正,这是因为在进行编译时,汇编软件会自动计算出查表指令距离表首地址的长度,从而自行修正,不需要人工干涉。

“问题补充”的内容:

MOV A,@R0 ;以寄存器R0中的内容为单元地址,并将这个单元地址中的数据传送至累加器A

ANL A,#0FH ;将累加器A中的内容和十六进制立即数0F进行逻辑“与”运算,结果再传送给A(这实际是要将累加器A中的高4位进行清0处理,而低4位保持不变)

ADD A,#16 ;累加器A中的内容和十进制立即数16进行相加,相加后的结果再传送给A(修正指令)

MOVC A,@A+PC ;典型的查表指令之一。含义:将累加器A中的内容和程序指针PC中的当前内容相加,相加后的结果作为要读取的程序存储器ROM的单元地址,并将这个单元地址中的内容传送给累加器A

唉……好久没来“知道”转转了,没想到刚一上来就敲了这么多字,也不知道楼主能看懂了没有?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-04-25
ADD A,#16是要计算地址偏移量
ADD A,#7 也一样
就是计算从查表的指令到表格之间有多少地址偏移

注意:
ADD A,#7 //从此处开始--------
MOVC A,@A+PC
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP
DEC R1
RET // 到这里结束,中间共有7条指令,所以偏移量=7
TABLE:DB’012345678’
相似回答