您现在所在的是:

单片机论坛

回帖:12个,阅读:2217 [上一页] [1] [2] [下一页]
* 帖子主题:

汇编求教

940
lied
文章数:21
年度积分:50
历史总积分:940
注册时间:2006/12/19
发站内信
发表于:2006/12/19 15:52:00
#0楼
我是一个初学汇编的新手,在学习查表指令时,怎么都想不通其中一个查表指令。(MOVC   A,@A+PC)这个PC的值到底如何确定呢?

一个例子:

在程序中定义一个0-9的平方表,利用查表指令找出累加器A=05H的平方值。

用:MOVE  A,@A+PC

ORG        0000H

MOV        DPTR,#TABLE                   ;表首地址赋予DPTR

MOV        A,#05                                

MOVC      A,@A+DPTR

SJMP        $

TABLE:     DB    0,1,4,9,16,25,36,49,64,81

END

用MOVC        A,@A+PC

ORG        0000H

MOV        A,#05

ADD         A,#04                       ;这里为何要加04呢?书上说这条指令是修正累加器

MOVC      A,@A+PC                  ;的值,修正值为查表指令距离表格首地址的字节减

SJMP       $                                ;1,但我的PC值是如何呢?这个修正值又如何计算

TABLE:    DB    0,1,4,9,16,25,36,49,64,81    ;出来的呢?

END


995
liyongfeng32
文章数:44
年度积分:50
历史总积分:995
注册时间:2006/10/24
发站内信
发表于:2006/12/20 12:25:00
#1楼
MOVC      A,@A+PC
SJMP       $      
你看一下,这两条指令各占多少字节,PC应该是指向当前执行指令的下一条指令的首地址
加上4,应该正好是表格的首地址
1064
工控秀才
文章数:80
年度积分:50
历史总积分:1064
注册时间:2006/6/16
发站内信
09工控人生征文
08年优秀博客奖
发表于:2006/12/20 15:06:00
#2楼
同意楼上的说法,不过究竟是+2还是+4我还有点怀疑.
14PIN的单片MCU多核心时代已来临,  想在低容量的MCU系统跑多任务吗,欢迎登陆"http://gongkong.gkbk.com"我的博客 查看详情,谢谢!
1185
85880527
文章数:136
年度积分:50
历史总积分:1185
注册时间:2006/1/16
发站内信
发表于:2006/12/20 17:50:00
#3楼
既然MOVC      A,@A+DPTR完全能实现这功能,你为什么偏偏要用MOVC      A,@A+PC去做呢,除非没事干
940
lied
文章数:21
年度积分:50
历史总积分:940
注册时间:2006/12/19
发站内信
发表于:2006/12/21 10:03:00
#4楼
以下是引用85880527在2006-12-20 17:50:00的发言:
既然MOVC      A,@A+DPTR完全能实现这功能,你为什么偏偏要用MOVC      A,@A+PC去做呢,除非没事干


其实学习的时候就是在于如何弄通每一条指令的实行和调用,这样在以后的编程中就可以尽可能的少走弯路。
940
lied
文章数:21
年度积分:50
历史总积分:940
注册时间:2006/12/19
发站内信
发表于:2006/12/21 10:23:00
#5楼
我觉得2楼说得不错,
我还有一个例子,
用程序实现c=a*a+b*b.设a,b,c存在于内部RAM的3个单元DATAA,DATAB,DATAC.
       MOV        A,DATAA
       ACALL      SQR                           ;子程序调用
       MOV        R1,A
       MOV        A,DATAB
       ACALL      SQR
       ADD         A,R1
       MOV         DATAC,A
       SJMP        $
SQR:  INC          A
       MOVC       A,@A+PC
       RET
TAB:  DB     '0,1,4,9,16'
        DB     '25,36,47,64,81'
       END
这里为什么只是加1,还有(TAB:  DB     '0,1,4,9,16'
        DB     '25,36,47,64,81')这里一定要分开吗?
为什么?
940
lied
文章数:21
年度积分:50
历史总积分:940
注册时间:2006/12/19
发站内信
发表于:2006/12/21 10:25:00
#6楼
MOVC     不是要占用2个字节吗?
RET       也不算字节数吗?
1185
85880527
文章数:136
年度积分:50
历史总积分:1185
注册时间:2006/1/16
发站内信
发表于:2006/12/21 17:30:00
#7楼
呵呵,去看对应的LST文件好了,里面每一指令的字节数列得好好的
1064
工控秀才
文章数:80
年度积分:50
历史总积分:1064
注册时间:2006/6/16
发站内信
09工控人生征文
08年优秀博客奖
发表于:2006/12/21 20:55:00
#8楼
[原创]这就是基础
哈哈,几年没有用汇编来写51了,竟然被我说中了!楼主的加4存在错误,该加2才对呀
后面是RET,单字节指令,所以加1.
至于后面的表格,当然可以写一起了,因为本来也不多,分行是为了方便观看
附件
14PIN的单片MCU多核心时代已来临,  想在低容量的MCU系统跑多任务吗,欢迎登陆"http://gongkong.gkbk.com"我的博客 查看详情,谢谢!
9012
吴辉
文章数:2351
年度积分:50
历史总积分:9012
注册时间:2002/1/15
发站内信
发表于:2006/12/22 8:33:00
#9楼
我也同意4楼的,用MOVC      A,@A+DPTR指令

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

78.0005