zoukankan      html  css  js  c++  java
  • 51单片机查表指令

    51单片机具有两条查表指令,用于从 ROM 中读出预存的数据:

        MOVC A, @A + PC
        MOVC A, @A + DPTR
        
        问题:在“MOVC A,@A+DPTR”和“MOVC A,@A+PC”中,分别使用了DPTR和PC作基址,请问这两个基址代表什么地址?使用中有何不同?  
    答案: 使用@A+DPTR基址变址寻址时,DPTR为常数且是表格的首地址,A为从表格首址到被访问字节地址的偏移量。 
    使用@A+PC基址变址寻址时,PC仍是下条指令首地址,而A则是从下条指令首地址到常数表格中的被访问字节的偏移量。 

    PC是程序计数器,DPTR是数据指针。用这个MOVC A,@A+DPTR比较方便的,DPTR是16位。范围广。建议使用。

    这两条都是查表指令,MOVC A,@A+PC,只能给累加器A赋值,所以只能查这条指令所在地址以后256字节范围内的代码或常数。
    而MOVC A,@A+DPTR,可以给DPTR赋给任何一个16位的地址值,所以查表范围可达整个程序存储器64K字节空间的代码或常数。

    其中前一条指令的用法,比较难,使用的时候,需要计算一个“偏移量”。不了解“指令的字节数”的人,都不清楚应该如何计算。
    做而论道曾在以前的文章中,介绍过“偏移量”的自动计算方法,可见如下链接:

    --------------------
    最佳答案:
    51单片机汇编语言有一条查表指令是:
        MOVC A, @A + DPTR
    它不是单独使用的,要和 DB 伪指令配套使用。

    例如:若累加器A中有一个0~9的数,请用查表法求出该数的平方值,设平方表表头地址为1000H。
    程序如下:
    ;-------------------------------------
        MOV DPTR, #1000H
        MOVC A, @A + DPTR 
        ……

        ORG 1000H
        DB   0, 1, 4, 9, 16, 25......
    ;-------------------------------------
    DB 伪指令从 ROM 1000H 开始,顺序存放了一系列的“平方”数据。
    MOVC A, @A+DPTR 指令中的A,如果等于0,就会在“平方”数据中取出第0个,就是0;
    MOVC A, @A+DPTR 指令中的A,如果等于1,就会在“平方”数据中取出第1个,就是1;
    MOVC A, @A+DPTR 指令中的A,如果等于2,就会在“平方”数据中取出第2个,就是4;
    MOVC A, @A+DPTR 指令中的A,如果等于3,就会在“平方”数据中取出第3个,就是9;
    …… 
    MOVC A, @A+DPTR 指令中的A,如果等于9,就会在“平方”数据中取出第9个,就是81。
    -------------------------------
    后记:
    这条指令的用法,相对前一条就简单了,事先并不需要计算“偏移量”。但是这条指令必须要使用寄存器DPTR。

    大家知道,凡是涉及到片外RAM存储单元的时候,基本上都要使用DPTR,这个DPTR寄存器通常是比较“繁忙”的,它形成了一个片内、片外之间,数据传传输的“瓶颈”。因此在读取ROM数据的时候,能够不用这后一条指令,就不要用它,应该尽量使用前一条指令。
    ==============================================================

  • 相关阅读:
    进度条
    html5 表单新增事件
    html5 表单的新增type属性
    html5 表单的新增元素
    html5 语义化标签
    jq 手风琴案例
    codeforces 702D D. Road to Post Office(数学)
    codeforces 702C C. Cellular Network(水题)
    codeforces 702B B. Powers of Two(水题)
    codeforces 702A A. Maximum Increase(水题)
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007469.html
Copyright © 2011-2022 走看看