登录
首页 单片机论坛
回帖 发帖
正文

主题:汇编求教

点击:2306 回复:12

我是一个初学汇编的新手,在学习查表指令时,怎么都想不通其中一个查表指令。(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
06-12-19 15:52
MOVC      A,@A+PC
SJMP       $      
你看一下,这两条指令各占多少字节,PC应该是指向当前执行指令的下一条指令的首地址
加上4,应该正好是表格的首地址
06-12-20 12:25
同意楼上的说法,不过究竟是+2还是+4我还有点怀疑.
06-12-20 15:06
既然MOVC      A,@A+DPTR完全能实现这功能,你为什么偏偏要用MOVC      A,@A+PC去做呢,除非没事干
06-12-20 17:50

引用 85880527 在 2006-12-20 17:50:00 发言【内容省略】

其实学习的时候就是在于如何弄通每一条指令的实行和调用,这样在以后的编程中就可以尽可能的少走弯路。
06-12-21 10:03
我觉得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')这里一定要分开吗?
为什么?
06-12-21 10:23
MOVC     不是要占用2个字节吗?
RET       也不算字节数吗?
06-12-21 10:25
呵呵,去看对应的LST文件好了,里面每一指令的字节数列得好好的
06-12-21 17:30
哈哈,几年没有用汇编来写51了,竟然被我说中了!楼主的加4存在错误,该加2才对呀
后面是RET,单字节指令,所以加1.
至于后面的表格,当然可以写一起了,因为本来也不多,分行是为了方便观看
附件
06-12-21 20:55
我也同意4楼的,用MOVC      A,@A+DPTR指令
06-12-22 08:33

上一页下一页

工控新闻

更多新闻资讯