入坑单片机(7):第7章汇编语言程序设计之查表程序设计 |
您所在的位置:网站首页 › dpl的原理 › 入坑单片机(7):第7章汇编语言程序设计之查表程序设计 |
顺序、循环、分支是程序按结构划分,而算术、查表、检索是程序按内容划分,盲猜前者会融进后者,所以我觉得把前者单独拿出来考不合算,比如算术程序设计就能捎带着一块考顺序、循环。 这一集我们来看查表程序设计 查表顾名思义,就是按映射集查找,既然是个找,那线索自然就是位置。 看个例题: 从这个例题中我们要学会的是具有推广意义的查表子程序: 首先,我们得了解个SFR——数据指针DPTR寄存器,它由两个8位的寄存器DPH(高8位)和DPL(低8位)组成。专门用来寄存片外RAM及扩展I/O口进行数据存取时的地址。编程时,既可以按16位寄存器来使用,也可以按两个8位寄存器来使用(即高位字节寄存器DPH和低位字节寄存器DPL)。对外部RAM也能间接寻址。 为啥要弄DPTR呢,因为查表的这个表往往在片外RAM。 查表子程序的一般结构为:设表头+定偏移+存储 查表子程序的复杂程度主要取决于定偏移。 对于单字节比如这个ASCII码的查表,定偏移的指令句群很简单,如果是多字节,那么它是多次单字节+单字节间步进。 它的子程序check1_2: MOV DPTR,#TABLE ;——————表头 MOV A,R2 ADD A,R2;这时候A=2x ;——————以上三句为一个指令句群,执行计算地址偏移量的功能 MOV R2,A;2x先存到R2中 ;——————该句单独为一个句群,为了步进作准备 MOVC A,@A+DPTR MOV R3,A :——————以上两句为一个指令句群,执行将查表查到的单字节存储功能 INC R2;R2步进1,表示2x+1 MOV A,R2; ;——————以上两句为一个指令句群,执行步进功能 MOVC A,@A+DPTR MOV R4,A ;——————以上两句为一个指令句群,执行将查表查到的单字节存储功能 RET TABLE:DW ……;伪指令DW用来定义程序存储器相邻两个单元的内容为常数,编译器会把常数的高8位放在前,低8位放在后。 所以,我建议的记忆方法是:设表头——算——查——步进——查——步进……表。三字节的与两字节的类似,就是继续步进,我估计要考的话考个双字节就行,整三字节干啥,没必要~ 不过还有个狗蛋的事情,前两个单、双字节都是对于表的数据而言,偏移量x都是单字节。如果偏移量x也是双字节的就又麻烦一些: 课本207页子程序如下: check2_2:MOV DPTR,#TABLE ;——————表头 MOV A,R3;取偏移量x的低8位 ADD A,R3;低位=2x低位 MOV R3,A;低位暂存 MOV A,R2;取偏移量x的高8位 ADDC A,R2;高位=2x高位+低位进位 MOV R2,A;高位暂存 ;———————我们可以看到计算偏移量的指令句群膨胀了一倍 MOV A,DPL ADD A,R3 MOV DPL,A ;DPL不能直接ADD,需要经过A的中转 ;————————以上三句为一个指令句群,执行低位偏移量配低位数据指针功能 MOV A,R2 ADDC A,DPH MOV DPH,A ;————————以上三句为一个指令句群,执行高位偏移量配高位数据指针功能 ;————————这两个句群也可以视为一个大的句群,执行偏移量配指针的功能 CLR A;前两个例题中没有,这句是该题特有的,A已结束指针配置的中转任务 MOVC A,@A+DPTR;查表,DPTR已经由上一步配置完成 MOV R4,A;存高位 ;————————以上三句为一个指令句群,执行单字节的查表存储 INC DPTR;步进,步进后就是低位了 ;————————该句单独为一个句群,执行步进功能 CLR A; MOVC A,@A+DPTR MOV R5,A;存低位 ;————————以上三句为一个指令句群,执行单字节的查表存储 RET TABLE:DW…… 所以我建议的记忆方法仍是:设表头——算——配——查——步进——查——步进……表, 算到查之间多了一步指针配置 查表指令和散转指令结合可以方便的实现程序散转。首先列表入口地址并赋键值 不过这个PPT里没有讲,先不管了。
|
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |