资源预览内容
第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
第9页 / 共14页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
4 应用程序设计应用程序设计文章来源:凌阳科技大学计划 作者:凌阳科技大学计划 发布时间:2005-6-7 14:03:35 1 查表程序查表程序查表,就是在以为关系建立的表格中,根据变量,查找值。由于SPCE061A 具有寄存器间接寻址和变址寻址方式,所以查表的基本方法有如下两种: 方法一:寄存器间接寻址方式Rn = 表首地址Rn += 偏移地址Rd = Rn /取得表中的数据方法二:变址寻址方式BP = 表首地址Rn = BP + 偏移地址 /取得表中的数据方法二要比前一种方法来得更简洁些,但是方法二中的偏移地址只能是 6 位的立即数。就是说,方法二查表范围限制在 64word 以内。这一点在使用时,需要提醒读者注意。由于 SPCE061A 有 32kwordFlash 的程序存储区,所以仅有零页的程序存储区(每页的存储区为 64kword),不涉及到程序区寻址的段选的内容。方法一和方法二,仅仅适用于表放在零页的程序存储区的情形1.1 一维数组查表程序一维数组查表程序程序 4-16 查 8 位十六进制数平方表/=/函数: F_Square()/语法:void F_Square(void)/描述:查 00xFF 的平方表。/参数:R1 = 待查的数,低 8 位有效。(仅仅查 00xFF 的平方值)/返回:R1 = 查表后的平方值结果/=F_Square: .PROCR1 /屏蔽高 8 位,仅使低 8 位有效R1 += Square_Table; /计算元素地址R1 = R1; /取得数据RETF;.ENDP.CODESquare_Table:/0255 平方表.DW 0, 1, 4, 9, 16/04 平方表.DW 25, 36, 49, 64, 81/510 平方表.DW 62500, 63001, 63504, 64009, 64516 /250255 平方表1.2 二维数组查表程序二维数组查表程序程序 4-17 二维数组查表/=/函数: F_Get_Array()/语法:void F_Get_Array(void)/描述:实现查表/参数:R1 = 元素下标 I(矩阵行号),R2 = 元素下标 j(矩阵列号)/返回:R1 = 查找到的元素,R2 = 查找成功标志(1 为查找成功,2 为行号溢出,3 为列号溢出)/=F_Get_Array: .procR3 = Array_Table; /取矩阵行数CMP R3,R1; /比较行是否出界JBE ?row; /如果出界,则跳到行溢出处理R4 = Array_Table+1; /取矩阵列数CMP R4,R2 /比较列是否出界JBE ?colum; /如果出界,则跳到列溢出处理MR = R1 * R4;R2 = R2 + R3; /计算元素地址的偏移量R2 += Array_Table+2; /计算元素地址的绝对地址R1 = R2; /取元素值R2 = 1; /成功标示RETF;?row:R2 = 2; /行溢出标志RETF;?colum:R2 = 3; /列溢出标志RETF;.ENDP.CODEArray_Table:.DW 3,5 /定义矩阵行数为 3,列数为 5.DW 1, 2, 3, 4, 5 /矩阵 0 行.DW 6, 7, 8, 9, 10 /矩阵 1 行.DW 11, 12, 13, 14, 15 /矩阵 2 行.ENDP1.3 查表散转程序查表散转程序在程序 4-18 介绍了一种散转程序的方法,这里我们通过查表的方法来实现散转。这两种方法尽管从形式上是不同的,但他们的实现机理是相同的:通过改变 PC 寄存器的值来实现的。这里,根据某个寄存器的内容为 0,1,2,分别转向处理程序0,1,2,。把转向的地址组成一个表,通过查表的方式决定程序的跳转。其流程图见图 4.27。程序 4-18 查表散转程序/=/函数: F_Swich()/语法:void F_Swich(void)/描述:实现查表/参数:R1 = 要转向的子程序的序号/返回:无/=F_Swich: .PROCR1 += Switch_Table;PC = R1;L_SubA:NOP;RETF;L_SubB:NOP;RETF;.ENDPSwitch_Table: /表定义为:.DW L_SubA.DW L_SubB2 数制转换程序数制转换程序2.1 二进制码到二进制码到 BCD 码的转换码的转换程序 4-19 二进制码到 BCD 码的转换的子程序:/=/函数: F_Binary_BCD()/语法:void F_Binary_BCD(void)/描述:R1 作为入口参数时,低字节存放的是待转换的二进制码。R1 作为出口参数时。其中 bob3 存的是个位,/ b4b7 存的是十位,b8b11 存的是百位。参考代码如下,程序流程如图4.28。/参数:R1(存放一个字节的二进制数)/返回:R1(存放 BCD 码)/=_F_Binary_BCD: .procPUSH R2,R4 TO SP;R2=0; /清零,准备存百位数R3=0; /清零,准备存十位数R4=0; /清零,准备存个位数R1 /屏蔽高字节CMP R1,100; /与 100 比较JB L_ShiWei /小于 100,则跳转L_BaiWei:R1-=100;R2+=1; /百位数加 1CMP R1,100;JAE L_BaiWei; /大于等于 100 继续求百位数L_ShiWei:CMP R1,10; /与 10 比较JB L_GeWei; /小于 10,则跳R1-=10;R3+=1; /十位数加 1CMP R1,10;JAE L_ShiWei; /大于 10,则跳L_GeWei:R4=R1;R1=0x0000;R1=R1 ROL 4; /移位寄存器清零R3=R3 ROL 4; /将十位数移出R2=R2 ROL 4; /将十位数移入 R2 寄存器(b4b7)R4=R4 ROL 4; /将个位数移出R2=R2 ROL 4; /将个位数移入 R2 寄存器(b0b3)R1=R2; /其中 b8b11 存的是百位POP R2,R4 FROM SP;RETF.ENDP2.2 BCD 码到二进制码的转换码到二进制码的转换程序 4-20 BCD 码到二进制码的转换的子程序说明:R1 作为入口参数时,存的是 BCD 码,其中 b0b3 存个位数的 BCD 码a,b4b7 存十位数的 BCD 码,b8b11 存百位数的 BCD 码,b12b15 存千位数的 BCD 码。R1 作为出口参数时,存的是转换后的二进制数。算法:设 BCD 码为 a,b,c,d,则相应的二进制数为1000a+100b+10c+d(a*10+b)*10+c)*10+d,将各位 BCD 码分离出之后,即可根据此式转换为二进制数。子程序代码如下,程序流程图见图 4.29。/=/语法:void F_BCD_Binary(int A)/参数:R1(存放一个字节的二进制数)/返回:R1(存放 BCD 码)/=_F_BCD_Binary: .procPUSH R2,R5 TO SP;R5=R1;R5=R5 LSL 4 /将千位数 a 移出R1=R1 ROL 4;R1 /将千位数 a 存入 R1;R2=10;MR=R1*R2 /a*10R5=R5 LSL 4; /将百位数 b 移出R1=R1 ROL 4;R1 /将百位数 b 存入 R1R1+=R3; /R1=(a*10+b)MR=R1*R2R5=R5 lsl 4; /将十位数 c 移出R1=R1 Rol 4;R1 /将十位数 c 存入 R1R1+=R3; /(a*10+b)*10+c)MR=R1*R2 /(a*10+b)*10+c)*10R5=R5 lsl 4; /将十位数 d 移出R1=R1 Rol 4;R1R1+=R3; /(a*10+b)*10+c)*10+dPOP R2,R5 FROM SP;RETF.ENDP2.3 二进制码到二进制码到 ASCII 码的转换码的转换程序 4-21 二进制码到 ASCII 码的转换说明: 对于小于等于 9 的 4 位二进制数加 0x30 得到相应 ASCII 码,对于大于 9 的4 位二进制数加 0x37 得相应 ASCII 代码。子程序代码如下:/=/函数: F_BinaRy_BCD()/语法:void F_BinaRy_BCD(int A)/描述:将一个 4 位的二进制数转化为 ASCII 码程序/参数:R1(存放一个 4 位的二进制数)/返回:R1(存放转换后的 ASCII 码)/=_F_BinaRy_BCD: .PROCPUSH R2,R5 TO SP;R1 /屏蔽高十二位CMP R1,0x0009; /与 9 比较JA L_To_F;R1+=0x0030; /小于、等于 9,则加 0x0030JMP L_Over;L_To_F:R1+=0x0037; /大于 9 则加 0x0037L_Over:POP R2,R5 FROM SP;RETF.ENDP2.4 十六进制数到十六进制数到 ASCII 的转换的转换程序 4-22 十六进制数到 ASCII 的转换子程序参考代码如下:/函数: F_Hex_ASCII()/语法:void F_Hex_ASCII(int A)/描述:将 1 位十六进制数转换为 ASCII 的程序/参数:R1(存放 1 位十六进制数)/返回:R1(存放转换后的 ASCII 码)/=
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号