《单片机原理及其应用 教学课件 ppt 作者 陈立周 陈宇 第3章》由会员分享,可在线阅读,更多相关《单片机原理及其应用 教学课件 ppt 作者 陈立周 陈宇 第3章(35页珍藏版)》请在金锄头文库上搜索。
1、第三章 汇编语言程序设计,第一节 汇编语言程序的格式 第二节 伪指令 第三节 汇编语言程序的编写步骤及基本 结构 第四节 程序设计举例,本章要点,本章介绍 汇编语言程序的书写格式、编写步骤以及程序的基本结构。通过一些具体范例,了解与掌握编程方法并从中掌握程序设计的基本技巧。,第一节 汇编语言程序的格式,汇编语言编写的程序由语句组成,每一语句占一行填写一条指令。每行分4段,分别为标号、操作码、操作数和注释。 ORG 2000H ADDR: MOV A,00H ;累加器清零 MOV 41H,A ;41H、42H清零 MOV 42H,A MOV R2,0AH ;设定累加次数 MOV R1,30H ;
2、设定数据首地址 LOOP:MOV A,R1 ;取数 ADD A,41H ;累加到41H JNC NEXT ;是否有进位 INC 42H ;有进位42H加1 NEXT: MOV 41H,A ;将和存入41H INC R1 DJNZ R2,LOOP LJMP $ END,标号:代表该行指 令所在的地址,结 尾应加一冒号,操作码:助记符或伪指令的符号。,操作数:操作所需要的数据或数据的存储位置来源,注释:对语句的说明,也可不加注释,返回本章首页,第二节 伪指令,伪指令不执行任何操作,汇编时也不生成目标程序。它仅仅提供对汇编的要求。汇编成机器语言后,伪指令就不存在了。以下为常用的伪指令: 1.ORG(
3、Origin)::指明汇编起始点地址。 2.END:指明源程序至此结束。 3.EQU(Epual):赋值伪指令,可对地址标号进行赋值。 4.DB(Define Byte):定义从指定标号地址开始所存放的字节数据,多字节时各字节间用逗号隔开。 5.DW(Define Word):定义从指定的标号地址开始,所存放的字数据。跟DB一样,输入几个字时各字间要用逗号隔开。 6.DS(Define Storage) :定义存储区,表示从标号所指的存储单元开始,保留的内存单元数量,以供程序使用。,返回本章首页,第三节 汇编语言程序的编写步骤 及基本结构,一、顺序结构: 顺序结构是指程序按指令顺序逐条执行的一
4、种结构。也是程序结构中最简单的一种结构。,二、分支结构: 指程序中具有转移指令,可根据转移条件决定是转移还是继续执行下一条指令。,几种分支结构程序的框图,三、循环结构 循环结构由四个环节组成。 1.初始化部分:对循环体中参加操作的有关参数、地址等赋以初始值,并指定循环结束条件。 2.循环体部分:指每次循环都需要重复执行的程序段。 3.修改初始值:每次循环结束都要对初始值进行修改,特别是判断结束条件的参数,每经一次循环后都要作相应的修改,以便决定是否结束循环。 4.结束判断部分:检查结束条件是否满足,若条件满足停止循环,否则返回继续执行循环体。,循环结构框图 图中每执行一次循环体后,都要检查结束
5、条件是否满足,若条件满足停止循环,否则返回继续执行循环体。 右边两图区别是先检查循环是否结束后修改初值,还是先修改初值后检查循环是否结束。,顺序结构的程序举例 例3-1 将地址为2000H 、2001H、2002H的片外数据存储单元的内容,分别传送到2002H、2003H、2004H存储单元中去。 ORG 0000H LJMP 1000H ORG 1000H MOV DPTR,#2002H MOVX A,DPTR MOV DPTR,#2004H MOVX DPTR,A MOV DPTR,#2001H MOVX A,DPTR MOV DPTR,#2003H,MOVX DPTR,A MOV DPT
6、R,#2000H MOVX A,DPTR MOV DPTR,#2002H MOVX DPTR,A SJMP $,分支结构的程序举例 例3-2 有甲乙两数存于41H和42H存储单元,运算符号的ASCII码存于40H单元,编写一根据40H的符号,对甲乙两数进行相应运算的程序;井将运算结果存于43H单元。 ORG 0000H LJMP 0100H ORG 0100 MOV A,40H CJNE A,#2BH,MINUS PLUS: MOV A,41H ADD A,42H MOV 43H,A SJMP CLOSE,MINUS:CJNE A,#2DH,ERR CLR C MOV A,41H SUBB A
7、,42H MOV 43H,A SJMP CLOSE ERR: MOV 43H,#0FFH CLOSE:SJMP $,循环结构的程序举例 例3-3 有一组数据,存放在30H为首地址的内存单元,数据长度为32个。试将每一个数分别取出加1,再存人以40H为首地址的内存单元。,ORG 0000H 0000 020100 LJMP 0100H 0100 ORG 0100H 0100 784F MOV R0,#4FH 0102 795F MOV R1,#5FH 0104 7F20 MOV R7,#20H 0106 E6 LOOP: MOV A,R0 0107 04 INC A 0108 F7 MOV R1
8、,A 0109 18 DEC R0 010A 19 DEC R1 010B DFF9 DJNZ R7,LOOP 010D 80FE SJMP $ END,循环结构程序举例 例3-4 编制一延时子程序,使执行这一段程序延时2s。 0100 7D64 MOV R5,#64H 0102 7E64 LOOP1: MOV R6,#64H 0104,7F62 LOOP2: MOV R7,#62H 0106 DFFE LOOP3: DJNZ R7,LOOP3 0108 DEFA DJNZ R6,LOOP2 010A DDF6 DJNZ R5,LOOPl 010C 22 RET 以上程序执行的时间近似为2秒,
9、如要准确计算还需考虑执行对R5、R6、R7的赋值指令所需的时间、RET返回指令的时间等等。,返回本章首页,第四节 程序设计举例,一、多字节加法程序 例3-5 两个10字节数,分别从存储单元0801H、和0901H开始存放,先存低字节后存高字节,求其和并存于乙数原来所在的单元。,多字节加法的程序 0100 ORG 0100H 0100 900801 MOV DPTR,#0801H ;甲数据地址 0103 75A009 MOV P2,#09H ;乙数据地址高字节 0106 7901 MOV R1,#01H ;乙数据地址低字节 0108 7F0A MOV R7,#0AH ;数据字节数 010A C3
10、 CLR C 010B E0 LOOP: MOVX A,DPTR ;取甲数 010C FC MOV R4,A ;暂存R4 010D E3 MOVX A,R1 ;取乙数 010E 3C ADDC A,R4 ;两数相加并加上一次进位位 010F F3 MOVX R1,A ;和存于原乙数的地址 0110 09 INC R1 ;修改地址指针 0111 A3 INC DPTR 0112 DFF7 DJNZ R7,LOOP ;继续相加 0114 E4 CLR A 0115 3400 ADDC A,#00H 0117 F3 MOVX R1,A ;存最高字节进位位 0118 80FE SJMP $ ;结束,二
11、、数制变换 例3-6 将30H中的十六进制数转换为BCD码,并存于40H、41H。 主程序:入口条件为待转换的十六进制数存R1 0100 ORG 0100H 0100 A930 MOV R1,30H 0102 122000 LCALL SUB 0105 8A40 MOV 40H,R2 0107 8B41 MOV 41H,R3 0109 80FE SJMP $ END,子程序:出口条件为转换所得BCD码存R2、R3 ORG 2000H 2000 E9 SUB ;MOV A,R1 ;取十六进制数 2001 75F064 MOV B,#64H 2004 84 DIV AB ;除以100 2005 F
12、A MOV R2,A ;商为百位数存R2 2006 740A MOV A,#0AH 2008 C5F0 XCH A,B ;除100余数作为下一次的被除数 200A 84 DIV AB ;余数再除以10 200B C4 SWAP A 200C 45F0 ORL A,B ;十位个位合并 200E FB MOV R3,A ;十位个位合并存R3 200F 22 RET,三、求最大值或最小值 1.无符号数求最大值与最小值 例3-7 在以2042H为首地址的存储单元中,连续存放一组单字节无符号数,数据个数存于2041H单元,从中找出最大数并存于2040H。,无符号数求最大值或最小值的程序 0100 ORG
13、 0100H 0100 902041 MOV DPTR,#2041H 0103 E0 MOVX A,DPTR 0104 FF MOV R7,A 0105 753000 MOV 30H,#00H 0107 A3 LOOP:INC DPTR 0108 E0 MOVX A,DPIR 0109 B53002 CJNE A,30H,HERE 010C 8004 SJMP TOSMA 010E 4002 HERE:JC TOSMA 0110 F530 MOV 30H,A ;大于30H取代原有值 0112 DFF3 TOSMA:DJNZ R7,LOOP ;小于30H,继续比较 0114 902040 MOV
14、 DPTR,#2040H 0117 E530 MOV A,30H 0119 F0 MOVX DPTR,A 011A 80FE SJMP $ END,2.带符号数求最大值或最小值 例3-8 组单字节带符号数据存放在以2042H为首地址的连续单元中,数据长度存放在2041H单元,找出的最大值存于2040H单元。,带符号数求最大值与最小值的程序 0100 ORG 0100H 0100 90204l MOV DPTR,#2041H 0103 EO MOVX A,DPTR 0104 FF MOV R7,A 0105 7900 MOV R1,#80H ;开始R1存最小值 -128 0107 A3 LOOP
15、: INC DPTR 0108 E0 MOVX A,DPIR 0109 FA MOV R2,A 010A C3 CLR C 010B 99 SUBB A,R1 010C 20E705 JB ACC.7,MINUS 010F 20D209 PLUS:JB OV,SMA 0112 8005 SJMP BIG,带符号数求最大值与最小值的程序(续) 0114 20D202 MINUS:JB OV,BIG 0117 8002 SJMP SMA 0119 EA BIG:MOV A,R2 011A F9 MOV R1,A 011B DFEA SMA:DJNZ R7,LOOP 011D 902040 MOV DPTR,#2040H 012