资源预览内容
第1页 / 共31页
第2页 / 共31页
第3页 / 共31页
第4页 / 共31页
第5页 / 共31页
第6页 / 共31页
第7页 / 共31页
第8页 / 共31页
第9页 / 共31页
第10页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
杭州杭州 浙江大学浙江大学 2009微机原理与接口技术微机原理与接口技术MicrocontrollersMicrocontrollers李 光李 光教 授教 授 PhD, DIC, MIET 王 酉王 酉博 士博 士PhD, MIET第第4章 汇编语言程序设计章 汇编语言程序设计?4-1 程序设计概述程序设计概述?4-2 伪指令伪指令?4-3 程序设计步骤程序设计步骤?4-4 程序设计实例程序设计实例程序语言分类?1机器语言:机器语言是用二进制代码0 和1表示指令和数据的最原始的程序设计语 言。?2汇编语言:在汇编语言中,指令用助记 符表示,地址、操作数可用标号、符号地 址及字符等形式来描述。?3高级语言:高级语言是接近于人的自然 语言,面向过程而独立于机器的通用语言。伪操作指令1、 ORG(Origin)定义程序的起始地址)定义程序的起始地址 2、 END 程序结束标志程序结束标志 3、 DB (Define Byte)定义字节)定义字节 4、 DW (Define Word)定义字)定义字 5、 EQU(Equate) 表达式赋值) 表达式赋值指令格式标号:标号:操作码操作数1,操作数2操作码操作数1,操作数2;注释;注释 例:LOOP: MOV A,#40H ;取参数例:LOOP: MOV A,#40H ;取参数1.标号:指令的符号地址1.标号:指令的符号地址2.操作码:指明指令功能2.操作码:指明指令功能3.操作数:指令操作对象、数据、地址、寄存器名及约定符号。3.操作数:指令操作对象、数据、地址、寄存器名及约定符号。 操作数1:目的操作数,操作数2:源操作数操作数1:目的操作数,操作数2:源操作数4.注释:说明指令在程序中的作用。4.注释:说明指令在程序中的作用。操作码和操作数是指令主体,操作码和操作数是指令主体,不是必须内容;不是必须内容;换行表示一条指令结束;换行表示一条指令结束;注意标点符号的使用。注意标点符号的使用。汇编语言格式:汇编语言格式:地址机器码源程序注释地址机器码源程序注释ORG 0000H; 整个程序起始地址; 整个程序起始地址0000 20 00 30 LJMP MAIN ; 跳向主程序; 跳向主程序ORG 0030H; 主程序起始地址; 主程序起始地址0030 C3 MAIN: CLR C ; MAIN为程序标号为程序标号0031 E6 LOOP: MOV A , R00032 37 ADDC A, R10033 08 INC R00034 DA FB DJNZ R1, LOOP ;相对转移;相对转移0036 80 03 SJMP NEXT0038 78 03 MOV R0, #03H003A 18 NEXT: DEC R0003B 80FE SJMP $ ;HERE: SJMP HEREEND ; 结束标记结束标记4.2 汇编语言程序设计步骤汇编语言程序设计步骤1.确定方案和计算方法 2.了解应用系统的硬件配置、性能指 标。 3.建立系统数学模型,确定控制算法 和操作步骤。 4.画程序流程图, 确定程序的流向 5. 编制源程序 (1)合理分配存储器单元和了解I/O 接口地址。 (2)按功能设计程序,明确各程序之 间的相互关系。 (3)用注释行说明程序,便于阅读和 修改调试和修改。开始开始1YN?子程序和参数传递子程序和参数传递一、 子程序的概念一、 子程序的概念 通常把一些基本操作功能编制为程序段作为独立的子程序, 以供不同程序或同一程序反复调用。在程序中需要执行这种操作的地方放置一条调用指令, 当程序执行到调用指令, 就转到子程序中完成规定的操作, 并返回到原来的程序继续执行下去。参数传递和现场保护?1、参数传递一般可采用以下方法:?传递数据。将数据通过工作寄存器R0R7或 累加器来传送。即主程序和子程序在交接处, 上述寄存器和累加器存储的是同一参数。?传送地址。数据存放在数据寄存器中,参数传 递时只通过R0、R1、DPTR传递数据所存放的 地址。?通过堆栈传递参数。在调用之前,先把要传送 的参数压入堆栈,进入子程序之后,再将压入 堆栈的参数弹出到工作寄存器或者其他内存单 元。2、 保护现场与恢复现场、 保护现场与恢复现场在调用子程序时,单片微机只是自动保护断点地址,但由 调用程序转入子程序执行时,往往会破坏主程序或调用程序的有 关寄存器(如工作寄存器和累加器等)的内容,也很可能破坏程 序状态字在调用子程序时,单片微机只是自动保护断点地址,但由 调用程序转入子程序执行时,往往会破坏主程序或调用程序的有 关寄存器(如工作寄存器和累加器等)的内容,也很可能破坏程 序状态字PSW中的标志位,从而在子程序返回后引起出错。因 此,必要时应将这些单元内容保护起来,即保护现场。中的标志位,从而在子程序返回后引起出错。因 此,必要时应将这些单元内容保护起来,即保护现场。对于对于PSW、A、B等可通过压栈指令进栈保护。工作寄存 器采用选择不同工作寄存器组的方式来达到保护的目的。一般主 程序选用工作寄存器组等可通过压栈指令进栈保护。工作寄存 器采用选择不同工作寄存器组的方式来达到保护的目的。一般主 程序选用工作寄存器组0,而子程序选用工作寄存器的其它组。,而子程序选用工作寄存器的其它组。当子程序执行完后,即返回主程序时,应先将上述内容送 回到来时的寄存器中去,这后一过程称为恢复现场。对于当子程序执行完后,即返回主程序时,应先将上述内容送 回到来时的寄存器中去,这后一过程称为恢复现场。对于PSW、 A、B等内容可通过弹栈指令来恢复。等内容可通过弹栈指令来恢复。在编写子程序时,还应注意保护(压栈)和恢复(弹出) 的顺序,即先压入者后弹出。在编写子程序时,还应注意保护(压栈)和恢复(弹出) 的顺序,即先压入者后弹出。程序实例?顺序程序结构顺序程序结构?例 :例 :两个无符号双字节数相加(子函数)。?设被加数存放于内部RAM的40H(高位字节), 41H(低位字节), 加数存放于50H(高位字 节), 51H(低位字节), 和数存入 40H和41H 单元中。?R0、R1中存放数据地址。程序如下: START: CLR C ; 将Cy清零 AD1: MOV A, R0 ; 被加数低字节的内容送入A ADD A,R1 ; 两个低字节相加 MOV R0, A ; 低字节的和存入被加数低字节中 DEC R0 ; 指向被加数高位字节 DEC R1 ; 指向加数高位字节 MOV A, R0 ; 被加数高位字节送入A ADDC A, R1 ; 两个高位字节带Cy相加 MOV R0, A ; 高位字节的和送被加数高位字节 RET 带符号数加减程序?正+正=负??负+负=正??正-负=负??负-正=正??OV标志:当位6和位7不同时有进位(借 位) 时,OV将置位。OV作为带符号数加减是否 超出范围(-128127)分支程序设计分支程序设计分支结构框图 (a) 单分支流程; (b) 多分支流程例:例:x, y均为8位二进制数, 设 x存入R0, y存入R1, 求解: +=011y000=xxx程序如下: START: CJNE R0, 00H, SUL1; R0中的数与00比较不等转移 MOV R1, 00H; 相等, R1 0 SJMP SUL2 SUL1: JC NEG ; 两数不等, 若(R0)0, 则 R101H SJMP SUL2 NEG: MOV R1, 0FFH ; (R0)0, 则 R10FFH SUL2: RET ORG 0000H LJMP START ORG 0030H VARDATA 30H FUNCDATA 31H START:MOV A,VAR JZDONE JNBACC.7, POS NEG:MOV A,#0FFH SJMP DONE POS:MOV A,#1 DONE:MOV FUNC,A SJMP $ END循环程序设计循环程序设计例:例: 工作单元清零。 在应用系统程序设计时, 有时经常需要将存储器中部分地址单元作为工作单元, 存放程序执行的中间值或执行结果, 工作单元清零工作常常放在程序的初始化部分中。 设有50个工作单元, 其首址为外部存储器8000H单元, 则其工作单元清零程序如下: CLEAR: CLR A MOV DPTR, 8000H ; 工作单元首址送指针MOV R2, #50 ; 置循环次数 CLEAR1: MOVX DPTR, A INC DPTR ; 修改指针 DJNZ R2, CLEAR1; 控制循环 RET 例 :例 :设在内部 RAM的BLOCK单元开始处有长度为LEN的无符号数据块, 试编一个求和程序, 并将和存入内部RAM的 SUM单元(设和不超过 8 位)。 BLOCK EQU 20H LEN EQU 30H SUM EQU 40H START: CLR A ; 清累加器A MOV R2, LEN; 数据块长度送R2 MOV R1, BLOCK ; 数据块首址送R1 LOOP: ADD A, R1 ; 循环加法 INC R1; 修改地址指针 DJNZ R2, LOOP ; 修改计数器并判断 MOV SUM, A; 存和 RET 多重循环多重循环例 :例 : 10 秒延时程序。 延时程序与 MCS - 51 执行指令的时间有关, 如果使用 12 MHz晶振, 一个机器周期为 1 s, 计算出一条指令以至一个循环所需要的执行时间, 给出相应的循环次数, 便能达到延时的目的。10 秒延时程序如下: DELAY: MOV R5, 100 DEL0: MOV R6, 200 DEL1: MOV R7, 248NOP DEL2: DJNZ R7, DEL2 DJNZ R6, DEL1 DJNZ R5, DEL0 RET ; 1 s ; 1 s ; 2 s 248=496 s ; (496+1+1+2 )s 200=0.1s ; (100000+1+2 )s 100=10.0003s ; 10.0003s+(2+1) s上例程序中采用了多重循环程序, 即在一个循环体中又包含了其它的循环程序, 这种方式是实现延时程序的常用方法。使用多重循环时, 必须注意: (1) 循环嵌套, 必须层
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号