310 likes | 501 Views
第四章 汇编语言程序设计. 学习指导. 1. 通过例子和上机调试找到程序设计的感觉 2. 记住 keil 软件的调试过程 3. 通过编程、上机调试来巩固掌握指令系统 4. 本章所有例子都现场调试. 学习目标. 1. 记住一些常用的程序例子 2. 掌握常见几种类型结构的汇编程序设计 3. 能在 keil 软件上编程调试 4. 初步具有程序设计的感觉. §4 - 1 汇编语言的基本概念. §4.1.1 单片机应用系统常见的开发语言. 汇编语言:能很好的直接控制硬件,程序小,执行的速度快。
E N D
第四章 汇编语言程序设计 学习指导 1.通过例子和上机调试找到程序设计的感觉 2.记住keil软件的调试过程 3.通过编程、上机调试来巩固掌握指令系统 4.本章所有例子都现场调试 学习目标 1.记住一些常用的程序例子 2.掌握常见几种类型结构的汇编程序设计 3.能在keil软件上编程调试 4.初步具有程序设计的感觉
§4-1 汇编语言的基本概念 §4.1.1 单片机应用系统常见的开发语言 汇编语言:能很好的直接控制硬件,程序小,执行的速度快。 但应用程序可移植性不好,特别是在开发复杂系统 应用的时候编程效率不高。 C51:具有很多的优越性,通过C语言可以很容易地直接控制 硬件,C51克服了汇编语言的缺点,又具有汇编语言的 优点。 1、程序好写,它是结构化语言,易于开发复杂的程序 2、程序易读懂,修改容易 3、移植性强 4、但要更好的编写C51程序,须掌握好汇编语言
§4.1.2 常见伪指令 伪指令是非执行指令,它只对源程序的汇编过程中起控制 作用 例: ORG 0000H MOV R2,#00H LOOP:INC R2 CJNE R2,#10H,LOOP MOV A,#00H MOV DPTR,#TAB MOV 40H,R2 SJMP $ ORG 2000H TAB: DB 00H,01H,02H,03H END 一、ORG 作用:设定程序或数据存储区的起始地址
使用注意:ORG 可多次使用,来规定不同程序段的起始地 址,但ORG所规定的地址应从小到大排列! 二、END 作用:表示源程序结束 使用注意:END在源程序中只能有一个,放在程序的末 尾,在END后的指令都不处理 三、DB 格式:『标号:』 DB 字节常数表 作用:从指定地址单元开始,定义若干字节的数据,常用于 表格
例: ORG 2000H TAB: DB 14H,26,’A’ DB 0AFH,’BC’ 汇编结果: (2000H)=14H, (2001H)=1AH, (2002H)=41H (2003H)=AFH, (2004H)=42H, (2005H)=43H 三、BIT 格式:字符名称 BIT 位地址 作用:用字符来表示位地址 例:QQ BIT (20H).0 ;用QQ来表示位地址00H PP BIT (29H).6 ; 用PP来表示位地址4EH 四、EQU 格式:字符名称 EQU 数或汇编符号 作用:用字符来表示数或汇编符号
例:BeiJiaShu EQU 32H ;使BeiJiaShu=32H JiaShu EQU 48H ;使JiaShu=48H Address EQU 2000H MOV A, BeiJiaShu MOV 40H,JiaShu ADD A,40H ;完成32H+48H 使用注意:EQU必须先赋值,后使用,不能先使用,后赋值 四、DATA 格式:标号 DATA 表达式 作用:在程序中定义数据地址 例:QQ DATA 1000H ;汇编后QQ=1000H 使用注意:DATA的使用与EQU相似,但DATA可先使用,后 赋值。
§4.2 汇编语言程序设计 明确要求,确定任务,建立模型 分析问题 找到解决问题的方法 确定算法 是程序设计的一部分,是把 算法转换位程序的准备阶段 流程图 力求简明,层次清晰,编写必要 的注释,方便调试和程序升级 源程序 调试 §4.2.1 汇编程序开发流程
开始 40H+0C2H N C=1? Y A=01H A=00H A送50H单元 结束
§4.2.2 顺序结构 特点:程序执行的方向不发生改变,也就是不执行跳转指令 和调用指令,是最简单、最基本的程序。 例1: ORG 0000H MOV R2,#02H MOV A,#56H ADD A,R2 MOV 40H,A MOV B,#02H MUL AB MOV 50H,A SJMP $ END
例2:设有两个BCD,分别存放在片内RAM的50H,51H单元和60H,例2:设有两个BCD,分别存放在片内RAM的50H,51H单元和60H, 61H单元中,求这两个数的和,结果存放在40H,41H中。要求 要求程序从1000开始。 ORG 1000H MOV A,50H ADD A,60H DA A MOV 40H,A MOV A,51H ADDC A, 61H DA A MOV 41H,A SJMP $ ;始终执行本行指令 END
例3:求16位二进制数的补码,设16位二进制存放在R7,R6中,求例3:求16位二进制数的补码,设16位二进制存放在R7,R6中,求 补后存放在R7,R6中,程序从2020H开始 ORG 2020H MOV A,R6 CPL A ADD A,#01H MOV R6,A MOV A, R7 CPL A ADDC A,#01H MOV R7,A END
§4.2.3 分支结构 特点:程序根据跳转指令程序执行的方向发生变化,分成若 干条不同的分支,主要通过条件转移指令来实现,设 计分支程序的关键是如何判断分支程序的条件。 N 条件真? N 条件真? 条件真? Y Y .... S0 S1 SN S1 S2 S
a+b (当b>=10时) a-b (当b<10时) Y= 结果y存在32H中 MOV 32H,A SJMP $ END ORG 0000H MOV A,31H CJNE A,#10,SUBAB ADDAB:ADD A,30H MOV 32H,A SJMP OVER SUBAB:JNC ADDAB CLR C MOV A,30H SUBB A,31H 例1:设数a在30H单元中,数b在31H中,编写下列计算式的程序
1 (当x>0时) 0 (当x=0时) -1 (当x<0时) 结果y存在32H中 Y= 例2:设符号数x存放在内RAM30H单元中,Y存放在内RAM40单 元中,编写下列计算式的程序 ORG 0000H MOV A,30H CJNE A,#00H,NOT_ZORO MOV 40H,#00H SJMP $ ZORO: JC ACC.7, FUSHU MOV 40H,#01H SJMP $ FUSHU: MOV 40H,#0FFH SJMP $ END
例3:根据R0中值,程序转移到不同分支去执行。即:例3:根据R0中值,程序转移到不同分支去执行。即: R0=0,转向TURN_0 R0=1,转向TURN_1 R0=2,转向TURN_2 R0=3,转向TURN_3 R0=4,转向TURN_4 R0=5,转向TURN_5
多分支程序设计 ORG 0000H MOV DPTR,#FENZHICHENGXU MOV A, R0 JMP @A+DPTR SJMP $ ORG 2000H FENZHICHENGXU: AJMP TURN_0 AJMP TURN_1 AJMP TURN_2 AJMP TURN_3 AJMP TURN_4 AJMP TURN_5 SJMP $ END
§4.2.4 循环程序 特点:在要求某一段程序重复执行的时候,用DJNZ指令 实现循环,这可大大简化程序,但指令执行的时间不会减 少。 循环程序流程图: 开始 置循环次数 循环体 N 循环结束? Y 循环体外程序 结束 置循环次数指令: MOV Rn , #XXH (是关键) 判断结束指令: DJNZ Rn , LOOP
例1:设有100个单字节数存在内 RAM30H开始的连续单元中,求这100个数的和,设和<=FFH,程序从1000H开始,编写求和程序 ORG 1000H MOV R2,#99 ;置循环次数 MOV R0,#30H CLC C MOV A,@R0 ;存被加数 LOOP:INC R0 ADDC A,@R0 DJNZ R2,LOOP ;判断循环是否完成 SJMP $ END
例2:设有10个单字节无符号数存在内 RAM40H 单元中,求这 10个数的最大数并把最大数送10H单元,编写求和程序 ORG 1000H MAIN:MOV R2,#09H ; 置循环次数 MOV R1,#40H ;把首地址40H给R1,使地址能自动增 1 MOV A,@R1 LOOP:INC R1 ;找到下一个单元地址 MOV 30H,@R1 CJNE A,30H,NOT_EQ ;相邻两个地址单元的值比较,相等顺序执行、不等就跳转到10H AGAIN: DJNZ R2,LOOP ;所有单元的数是否比较完成。 JMP MAX ;把所得的最大值送10H单元 NOT_EQ:JC MAX1 ;前面单元的数小于后面单元的数值 ,跳转到MAX1处 JMP AGAIN ;前面的数大于后面的数 MAX1:MOV A,30H ;把相邻两个单元的大数送A,与后面的单元做重复算法的比较 JMP AGAIN MAX:MOV 10H,A ;把最大值送10H SJMP $ ;程序在此踏步运行 END
例3:设有10个单字节无符号数连续存在内 RAM40H 单元中,编写 程序将这10个数由小到大排序。 ORG 0000H MOV R2,#09H START:MOV R0,#40H MOV A,@R0 LOOP:INC R0 MOV 30H,@R0 CJNE A,30H,NEXT AGAIN:DJNZ R2,LOOP MOV R2,#09H DJNZ R2,START SJMP $ NEXT:JNC Q_BIG Q_SMALL:MOV A,30H JMP AGAIN Q_BIG:MOV @r0,a DEC R0 MOV @R0,30h INC R0 JMP AGAIN END
§4.2.5 调用子程序 在多次进行相同的计算和操作的时候,为简化程序代码,把 这些相同的动作的指令编写为一特定结构的程序,这个特定 结构的程序称为子程序。 调用指令: LCALL 标号 返回指令: RET
例1: 使P1全为0 10uS,P1全为1 10uS 以此无限循环 ORG 0000H START:MOV A,#00 MOV P1,A LCALL DELAY MOV P1,#OFFH JMP START DELAY:MOV R7,#20 MOV R6,#250 DJNZ R6,$ DJNZ R7,DELAY RET END
§4.2.6 程序设计小结 必须找到程序设计的感觉,通过不断的练习建立独立编写符 合要求的程序: 方法: 1、先读简单完整程序 2、记住程序 3、试背写程序 4、在一阶段后独立写简单程序 5、通过上机调试来加强对指令过程的理解
程序设计小结----巩固练习 例1:将数据存储器中以2000H为首地址的100个连续单元清零 ORG 0000H Block equ 2000h mov dptr, #Block ; 起始地址 mov r0, #64H ; 清 100个单元 clr a Loop: movx @dptr, a inc dptr ; 指向下一个地址 djnz r0, Loop ; 记数减一 sjmp $ end
例2:编程将片内40H~60H单元中的内容传送到以2100H为起始地例2:编程将片内40H~60H单元中的内容传送到以2100H为起始地 址的外部存储区中 ORG 1000H START:MOV R2,#21H ;置循环次数 MOV R0,#40H ;数据源起始地址 MOV DPTR,#2100H ;目的地址起始地址 LOOP: MOV A,@R0 MOVX @DPTR,A INC R0 ;数据源地址自增 INC DPTR ;目的地址自增 DJNZ R0,LOOP SJMP $ END
例3:编程计算片内50H~57H单元中(分别为00、01、02、03、例3:编程计算片内50H~57H单元中(分别为00、01、02、03、 04、05、06、07)数的算术平均值,结果存放在5AH中 ORG 0000H START:MOV R2,#07H ;置循环次数 MOV R0,#50H ;数据源起始地址 MOV A,@R0 LOOP: INC R0 ;数据源地址自增 ADDC A,@R0 DJNZ R0,LOOP MOV B,#08 DIV AB SJMP $ END
例4:编程将一个二进制数7BH(123)转换成BCD码,转换结果依次存 放在以Result开始的三个单元中。 Result equ 20h org 0000h jmp Start BinToBCD: mov b, #100 div ab mov Result, a ; 除以 100, 得百位数 mov a, b mov b, #10 div ab mov Result+1, a ; 余数除以 10, 得十位数 mov Result+2, b ; 余数为个位数 ret Start: mov sp, #40h mov a, #123 call BinToBCD ljmp $ end
例5:编写程序,将字符串“MICROCONTROL”装入外RAM以2400H例5:编写程序,将字符串“MICROCONTROL”装入外RAM以2400H 开始的单元中。 ORG 0000H START: MOV R2,#12 MOV R0,#00H MOV R4,#24H MOV R3,#00H LOOP: MOV A,R0 MOV DPTR,#TAB MOVC A, @A+DPTR MOV DPL,R3 MOV DPH,R4 MOVX @DPTR,A INC R0 INC R3 DJNZ R2,LOOP SJMP $ TAB: DB 'MICROCONTROL' END
例6:编写程序求,内RAM 30H~35H单元中的单字节正整数按从大到小的顺序排列 ORG 0000H MAIN: MOV R2,#05H START:MOV R0,#35H MOV A,@R0 LOOP: DEC R0 MOV 40H,@R0 CJNE A,40H,NEXT AGAIN: DJNZ R2,LOOP MOV R2,#05H DJNZ R2,START SJMP $ NEXT: JNC Q_BIG Q_SMALL:MOV A,40H JMP AGAIN Q_BIG: MOV @R0,A INC R0 MOV @R0,40H DEC R0 JMP AGAIN END
例7:编程将30H的低四位与31H单元中的高四位拼成一个新数,即高四位是30H的低四 位、低四位是31H的高四位并存在40H。(30H)=34H、(31H)=56H、(40H) =45H ORG 0000H START:MOV R0,#30H MOV A,@R0 ANL A,#0FH SWAP A MOV 40H,A INC R0 MOV A,@R0 SWAP A ANL A,#0FH ORL 40H,A SJMP $ END
本章内容全部结束,请大家熟练掌握程序设计的思想与方法为后续课程奠定良好基础!本章内容全部结束,请大家熟练掌握程序设计的思想与方法为后续课程奠定良好基础!