《单片机教案(汇编语言程序设计)课件》由会员分享,可在线阅读,更多相关《单片机教案(汇编语言程序设计)课件(82页珍藏版)》请在金锄头文库上搜索。
1、,计算机硬件技术基础,专题五 汇编语言程序设计,第四章,主讲教师 赵晓安,计算机科学与软件学院计算机基础教学部,本章重点,教学目标: 本章内容是软件编程的关键,地位重要。 程序结构(顺序、分支、循环、子程序); 应用实例; 熟练掌握程序设计的思路方法和技巧; 要求掌握典型算法; 找到分析问题和解决问题的着眼点; 学会抓住不同问题的规律性; 举一反三,独立思考,有创意,有新意,独到。,一、分清可执行指令和非执行指令及其功能 二、将高级语言程序设计方法迁移到汇编语言程序设计中来 三、特别注意汇编语言是面向机器的, 要记住 CPU的资源; 存储器结构与寻址方式; I/O口、定时/计数器、中断系统等关
2、键的参数; 寄存器间接寻址中指针的选择和使用技巧。 四、从宏观上看,MCS-51汇编语言程序的整体结构 从微观上看,微机中各组成部分是如何通过程序联系起来。,汇编语言程序设计的要点:,41 汇编语言程序设计基础 42 MCS-51 单片机汇编语言程序设计,第四章 汇编语言程序设计,411 汇编语言与机器语言 412 汇编语言的格式 413 伪指令 414 汇编语言源程序的汇编 415 汇编语言程序设计的一般步骤,41 汇编语言程序设计基础,421 简单程序设计 422 分支程序设计 423 循环程序设计 424 查表程序设计 425 散转程序设 426 子程序设计 427 运算程序设计,42
3、MCS-51 单片机汇编语言程序设计,机器语言 计算机唯一能够识别和执行的语言,面向机器,二进制。 汇编语言 “符号语言”,用指令助记符代表机器语言指令,面向机器。 要经过汇编。 低级语言适合开发实时控制程序 高级语言 面向算法、过程、对象,类似自然语言,可移植性好,须经解释或翻译后才能被执行。,411 汇编语言与机器语言,412 汇编语言的格式,指令格式:,伪指令格式: 名字 定义符 参数,参数;注释或 标号:定义符 项表 ;注释,1 标号段 标号段位于语句的开头,指明标号所在指令的首地址,标号又称为标号地址或符号地址,是一个可选项,只有需要时才设置。 绝对不允许把指令的保留字、寄存器号及伪
4、指令字符作为语句的标号; 标号在同一程序单位中只能出现一次。 2、 操作码段 操作码段可以是可执行指令的助记符,操作码段用于指示计算机进行何种操作,因此,是任何一条语句中的必选项,汇编语言根据这一字段生成目标代码。 操作码段也可以是伪指令的助记符,对汇编程序下命令,在汇编时起作用。,LOOP: MOV A,R0 DJNZ R2,LOOP,3、操作数段 操作数段用于存放指令的操作数或操作数地址 , 操作数的个数因指令的不同而不同,通常有三种情况: 无操作数 RET 单操作数 JC LOOP 双操作数 MOV A,B 可以采用字母或数字等多种表示形式: (1) 操作数是立即数,可用二进制、十进制和
5、十六进制形式 (2) 作寄存器和特殊功能寄存器名 MOV A,PSW (3) 标号地址 DJNZ R7,NEXT (4) 带加、减运算符的表达式 ,例:MOV A,#100-1 4、 注释段:注释指令或程序的含义,便于阅读程序、维护程序。 必须用“;”隔开,续行时,也必须以“;”开头 。,常数: 01010101B;12D,12;0F1H,59H 67Q;A,a 操作数: A,B,DPTR 表达式 mov A,#(12H-03H),414 汇编语言源程序的汇编,汇编可分成两种: 人工汇编 机器汇编 机器汇编是用机器自动把汇编语言源程序翻译成可以运行的目标代码程序,即二进制程序的过程,它是一种用
6、机器来代替人脑的汇编,完成这一汇编过程的软件称为“汇编程序”。,汇编,机器语言目标程序,汇编语言源程序,汇编程序,汇编,机器语言目标程序,汇编语言源程序,人工查指令机器码表,415 汇编语言程序设计的一般步骤,程序设计的方法 程序设计的步骤,程序设计的方法,结构化设计 模块化设计 开发方法 自底向上开发 先底层开发 自顶向下开发 先顶层开发 混合方法,底,顶,程序设计的步骤,分析课题,确定算法和思路 根据算法和思路画出流程图 根据流程图编写程序 上机调试,排除错误,流程图图例,起止框 处理框 判断框 连线,程序设计步骤流程图,413 伪指令,定义:仅向汇编程序发出的,并仅由汇编程序在汇编过程中
7、识别和执行的一种汇编控制命令,它本身在目标程序中不产生机器码。 汇编起始伪指令:ORG 汇编结束伪指令:END 定义字节伪指令:DB 定义字伪指令: DW 定义位伪指令: BIT 赋值伪指令: EQU DATA,汇编起始伪指令,格式: ORG 功能:指定汇编源程序编译成机器语言程序 的起始地址 例如: ORG 0000H LJMP 0100H ORG 0100H Start: MOV A,#5AH SJMP $ END,程序中可以有多条ORG语句,但定义的起始地址既不要交叉,也不要重叠。 必须从小地址向大地址分配程序所占空间。,汇编结束伪指令,格式: END 起始地址 功能:停止汇编 示例:O
8、RG 0000H ljmp 0100H ORG 0100H Start: mov A,#5Ah sjmp $ END,定义字节伪指令,格式: DB 功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表可以是一个字节、数或以引号括起来的字符串。 ORG 1000H Dat: DB 11h,-1,A,BCD END,该指令只能为程序存储器赋初值,不能为其他存储器赋初值,尤其不能为内部数据存储器赋初值。,注意:,1000H,11H,FFH,41H,42H,程序存储器,43H,44H,补码,ASCII码, ,定义字伪指令,格式: DW 功能:把项或项表的数值存入从标号开始的连续单元,其中项或项
9、表是一个字(两字节)。 ORG 1000H Dat: DW 1122h,3344h,-1 END,1000H,11H,22H,33H,44H,程序存储器,只对程序存储器起作用,FFH,FFH,定义位伪指令,格式: BIT 功能:定义位变量地址 U BIT 20H.0 V BIT 20H.1 W BIT 20H.2 X BIT P1.0 Y BIT P2.4 Z BIT P3.2 Q BIT TCON.2,赋值伪指令,格式: EQU 功能:定义符号变量值 X EQU 05H Y EQU 06H NEXT EQU 2000H 格式: DATA 功能:定义符号变量值(内部RAM) ONE DATA
10、30H (数据或地址) TWO DATA ONE+1,421 简单程序设计, 特点: 从第一条指令开始依次执行每一条指令,直到程序执行完毕,中间没有转移指令,没有分支。 只有一个入口一个出口。,入口,出口,1、例43 两位压缩的BCD码转换成相应的ASCII码 算法1 ANL 拆字、ORL #30H拼字 算法2 DIV 拆字、 ORL #30H 拼字 存储 两位BCD数指压缩的BCD码占一个单元 相应的ASCII码占二个单元,2、例44 将8位无符号二进制数转换成三位BCD码 算法1 DIV 100 得百位,再DIV 10 的十位和个位 算法2 DIV 10 的个位,再DIV 10 的十位和百
11、位 存储 8位无符号二进制数占一个单元 个位、十位和百位各占一个单元,422 分支程序设计,用条件转移语句实现二分支 用cjne实现三分支 例4-6 多分支 用 jmp A+DPTR 实现多分支,根据不同的条件,执行不同的程序段。 JZ、JNZ、JC、JNC、JB、JNB、CJNE 、DJNZ 正确合理地运用,用条件转移语句实现二分支,用cjne实现三分支,编程要点: cjne = 等于 不等于则: jc 大于 如何实现 ? ?,ORG 0000H Cjne R3,#15,NEQ sjmp L1 ;=15 NEQ: jnC L1 ;15 sjmp L2 ;15 L1: nop ;15 L2:,
12、y=,(R0)x,(R1)y,2、判正负,CJNE R0,#0,NZERO,CLR C MOV A,R0 SUBB A,#0 JZ ZERO,MOV A,R0 JZ ZERO,其它方法?,分析:,1、判零,MOV A,R0 JNB ACC.7, positive,CJNE R0,#7FH,DO1 SJMP positive DO1: JC positive ;negative Positive:. 0FFH80H negative 00H7FH positive,用cjne实现三分支,cjne R0,#0,MP1 mov R1,#0 sjmp MP3 MP1:mov A,R0 jnb ACC.
13、7,MP2 mov R1,#0FFh sjmp MP3 MP2:mov R1,#01h MP3:sjmp $ end,y=,(R0)x,(R1)y,判正负,判零,分支间 隔离,ORG 1000H ONE DATA 30H TWO DATA 31H MAX DATA 32H CLR C MOV A ,ONE SUBB A ,TWO JZ XMAX JB ACC7 , NEG JB OV , YMAX SJMP XMAX NEG:JB OV , XMAX YMAX:MOV A ,TWO SJMP RMAX XMAX:MOV A , ONE RMAX:MOV MAX , A SJMP $ END,例
14、46 ONE和TWO单元中的两个带符号数比较大小,将较大者存入MAX单元中。两数相等则任一个存入MAX即可。,若XY为负,则OV=0,XY,若XY为正,则OV=0,XY OV=1,XY,用 jmp A+DPTR 实现多分支,KeyB5: mov DPTR,#JMPTBL clr C subb A,#0Ah rl A JMP A+DPTR JMPTBL: ajmp AAA ajmp BBB ajmp CCC ajmp DDD AAA: BBB: ,键入 10,转AAA 11,转BBB 12, 转CCC 13, 转DDD,CCC: DDD: ,(A)=?,语句组1,语句组2,语句组3,语句组4,0
15、AH,0BH,0CH,0DH,入口,AAA,BBB,CCC,DDD,423 循环程序设计,循环程序结构 循环程序通常有两种编制方法 循环问题的类型 循环程序设计举例,循环程序结构,循环初始化: 循环控制变量的初始化、 数据变量的初始化 循环工作部分:循环主体,重复执行的部分 循环控制部分:循环变量的修改、终止控制 循环结束:这部分程序用于存放执行循环程序所得结果以及恢复各单元的初值。,1、先循环处理后循环控制,称为直到型循环;,2、 先循环控制后循环处理,称为当型循环。,循环程序通常有两种编制方法,1、计数型 举例 循环次数已知,用计数方法控制循环的终止。 2、条件型 循环次数未知,根据某种条件判断是否终止循环。 例47 内部RAM块传,遇到“#”字符结束 3、计数型+条件型 例48 8031外部RAM块传及冒泡排序 重点,循环问题的类型,单循环程序 例1:多个单字节数求累加和 计数型 例2:内部数据区清零 计数型 例47 内部RAM块传 改为条件型没讲 多重循环程序 例3:50ms延时程序 计数型 例47 内部RAM块传 计数型+条件