51单片机查表的问题???

chp845 2010-06-08 10:13:37
题目:设有一个巡回检测报警设置,需对16路输入进行测量控制,每路有一个最大允许值,它为双字节字数.控制时根据测量的路数,找出该路的最大允许值,判断输入值是否大雨最大允许值,如大于则报警.取路数为x(0<=x<=15),y为最大允许值放在程序存贮器的常数表,在查表之前路数x存放R2,查表的结果y放在R3R4中,则查表程序如下
LTB1:MOV A,R2
ADD A,R2 ;R2*2->A
MOV R3,A ;保存指针
ADD A,#(TAB1-LTB2) ;加上偏移量
MOVC A,@A+PC ;查第一字节
LTB2: XCH A,R3 ;单字节指令
ADD A,#(TAB1-LTB3) ;双字节指令
MOVC A,@A+PC ;查第二个字节,单字节指令
LTB3:MOV R4,A ;单字节指令
RET
TAB1:DW 1520,3271,42645,7850
DW 3483,32657,883,9943
请问上面查询第二个字节指令是怎么查找的,不应该再加上A的内容再加上1才是第二个字节的地址吗????
...全文
362 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sytu_chyq 2010-06-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lbing7 的回复:]
[/Quote]
PC的增加值跟偏移量的减小值不一样么
还用是DPTR吧
lbing7 2010-06-09
  • 打赏
  • 举报
回复
ADD A,#(TAB1-LTB2) ;加上偏移量
MOVC A,@A+PC ;查第一字节
LTB2: XCH A,R3 ;单字节指令
ADD A,#(TAB1-LTB3) ;双字节指令
MOVC A,@A+PC ;查第二个字节,单字节指令

PC已经变了。。。

执行到第二个MOVC A,@A+PC ;查第二个字节,单字节指令的时候

PC已经比之前的PC加二了

所以程序是正确的。。。

不过这么写有点装,没啥事用DPRT来读写ROM好一些,如果指令系统支持的话

这样可读性要高
sytu_chyq 2010-06-09
  • 打赏
  • 举报
回复
不是很懂
看了感觉应该加1啊
kool86 2010-06-09
  • 打赏
  • 举报
回复
CCCCCCCCCCCCC
chp845 2010-06-09
  • 打赏
  • 举报
回复
有人详细讲解下吗???求救了呀.....
chp845 2010-06-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sytu_chyq 的回复:]

引用 7 楼 lbing7 的回复:

PC的增加值跟偏移量的减小值不一样么
还用是DPTR吧
[/Quote]
我也觉得有些问题...
chp845 2010-06-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lbing7 的回复:]

ADD A,#(TAB1-LTB2) ;加上偏移量
MOVC A,@A+PC ;查第一字节
LTB2: XCH A,R3 ;单字节指令
ADD A,#(TAB1-LTB3) ;双字节指令
MOVC A,@A+PC ;查第二个字节,单字节指令

PC已经变了。。。

执行到第二个MOVC A,@A+PC ;查第二个字节,单字节指令的时候

PC已经比之前的PC加二了……
[/Quote]
#(TAB1-LTB3)和
#(TAB1-LTB2)是什么地址呀???
ADD A,#(TAB1-LTB3) ;双字节指令
MOVC A,@A+PC ;不就是相当于((A)+(PC))->A,pc内容不就是#LTB3?而A的内容就是#(TAB1-LBT3)

ADD A,#(TAB1-LTB2) ;加上偏移量
MOVC A,@A+PC ;不就是相当于((A)+(PC))->A,pc内容不就是#LTB2?而A的内容就是#(TAB1-LBT2)

算下来结果不是应该是一样的吗????不应该需要A加上1吗???
Peasant_Lee 2010-06-08
  • 打赏
  • 举报
回复
汇编我不经常用,不敢发表任何意见,呵呵,帮顶。
chp845 2010-06-08
  • 打赏
  • 举报
回复
求高手指导一下了呀
chp845 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qingfeng200634 的回复:]

你这应该是单片机里 的偏移值(或者叫修正值)的错误。用pc时有用到。 这个书本上写的很清楚 那个需要计算。DPTR 则只需加1就可以。
[/Quote]
ADD A,#(TAB1-LTB3) ;双字节指令
MOVC A,@A+PC ;

ADD A,#(TAB1-LTB2) ;加上偏移量
MOVC A,@A+PC ;查第一字节
不是查询地址的位置是一样的吗??不也是双字节数的首地址吗???
可以讲清楚点,可以吗??我知道dptr只需要加一就可以了呀,但是
ADD A,#(TAB1-LTB3) ;双字节指令
MOVC A,@A+PC ;这两条指令不也需要加上1才能得到双字节第二个字节的地址呀....
qingfeng200634 2010-06-08
  • 打赏
  • 举报
回复
你这应该是单片机里 的偏移值(或者叫修正值)的错误。用pc时有用到。 这个书本上写的很清楚 那个需要计算。DPTR 则只需加1就可以。

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧