第4章 单片机汇编语言程序设计 51课件.ppt
文本预览下载声明
用累加器A或工作寄存器Rn传递参数 例:把A中一个十六进制数的ASCⅡ字符转换为一位十六进制数。 主程序部分: START: ┋ ; MOV A,#34H ;设置入口参数于A中 子程序: ASCH: CLR C SUBB A,#30H CJNE A,#10,$+3 ;$+3为下条指令的首址 JC NEXT ;(A)﹤10,转NEXT SUBB A,#07H ;(A)≥0AH,则再减07H(共减37H) NEXT: NOP RET @ R0 @ R0 @ R0 ⑶ 通过操作数地址传递参数 入口参数:(R0)=求补数低字节指针,(R7)=n-1 出口参数:(R0)=求补后高字节指针 例4-25 n字节求补子程序CPLN CPLN: MOV A,@R0 CPL A ADD A,#1 MOV @R0,A MOV A,@R0 CPL A ADDC A,#0 MOV @R0,A RET NEXT: INC R0 DJNZ R7, NEXT 上页 下页 回目录 内部RAM 字节1 字节2 字节3 … … 字节n @ R0 @ R0 ⑷ 通过堆栈传递参数 例4-26 在HEX单元存放两个十六进制数,将它们分别 转换成ASCII码并存入ASC和ASC+1单元 解: 由于要进行两次转换,故可调用查表子程序完成 上页 下页 回目录 HEX SP SP SP SP . . . PUSH HEX LCALL HASC POP ASC MOV A, HEX SWAP A PUSH ACC LCALL HASC POP ASC+1 . . . MOVC A,@A+PC HASC: DEC SP DEC SP POP ACC ANL A,#0FH ADD A,#5 PUSH ACC INC SP INC SP RET ASCTAB: DB ‘0 1 2 … 7’ DB ‘8 9 A … F’ 60H 61H 62H 63H 64H HEX *PCL *PCH PC 断点 SP 0000 HEXL ASC A ASC SP SP SP SP 主程序 子程序 上页 下页 回目录 5). 用寄存器作指针来传递参数 例2:将片内一组区域清零子程序如下: ZOER: CLR A LOOP: MOV @R0, A; INC R0 DJNZ R2 ,LOOP; RET 分析入口参数? 出口参数? 编程完成20H~28H和30H~39H两段区域清零. 3、现场保护 现场保护: 如果子程序使用的寄存器与主程序使用的寄存器 有冲突,在转入子程序前,特别是进行中断服务 子程序时,要进行现场保护。 保护内容: 主程序使用的内部 RAM 内容,各工作寄存器内容, 累加器 A 和 DPTR 以及 PSW 等寄存器内容。 保护方式: 将要保护的单元压入堆栈。 上页 下页 回目录 中断保护时:还可以用 RS1 RS0 来选择其他通用寄存器组, 以便保护主程序现场。 R0 ~ R7 例如:十翻二子程序的现场保护 BCDCB: PUSH ACC PUSH PSW PUSH DPL PUSH DPH . . . POP DPH POP DPL POP PSW POP ACC RET 推入与弹出应按照“先进后出”,或“后进先出”的顺序 ; ; 保护现场 ; ; 十翻二 ; ; 恢复现场 ; ; ; 上页 下页 回目录 三、子程序的调用及嵌套 1、子程序的调用 例4-27 将内部RAM41H~43H中内容左移4位,移出部分送 40H
显示全部