1 / 31

第四章 汇编语言程序设计

第四章 汇编语言程序设计. 学习指导. 1. 通过例子和上机调试找到程序设计的感觉 2. 记住 keil 软件的调试过程 3. 通过编程、上机调试来巩固掌握指令系统 4. 本章所有例子都现场调试. 学习目标. 1. 记住一些常用的程序例子 2. 掌握常见几种类型结构的汇编程序设计 3. 能在 keil 软件上编程调试 4. 初步具有程序设计的感觉. §4 - 1 汇编语言的基本概念. §4.1.1 单片机应用系统常见的开发语言. 汇编语言:能很好的直接控制硬件,程序小,执行的速度快。

aurek
Download Presentation

第四章 汇编语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 汇编语言程序设计 学习指导 1.通过例子和上机调试找到程序设计的感觉 2.记住keil软件的调试过程 3.通过编程、上机调试来巩固掌握指令系统 4.本章所有例子都现场调试 学习目标 1.记住一些常用的程序例子 2.掌握常见几种类型结构的汇编程序设计 3.能在keil软件上编程调试 4.初步具有程序设计的感觉

  2. §4-1 汇编语言的基本概念 §4.1.1 单片机应用系统常见的开发语言 汇编语言:能很好的直接控制硬件,程序小,执行的速度快。 但应用程序可移植性不好,特别是在开发复杂系统 应用的时候编程效率不高。 C51:具有很多的优越性,通过C语言可以很容易地直接控制 硬件,C51克服了汇编语言的缺点,又具有汇编语言的 优点。 1、程序好写,它是结构化语言,易于开发复杂的程序 2、程序易读懂,修改容易 3、移植性强 4、但要更好的编写C51程序,须掌握好汇编语言

  3. §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 作用:设定程序或数据存储区的起始地址

  4. 使用注意:ORG 可多次使用,来规定不同程序段的起始地 址,但ORG所规定的地址应从小到大排列! 二、END 作用:表示源程序结束 使用注意:END在源程序中只能有一个,放在程序的末 尾,在END后的指令都不处理 三、DB 格式:『标号:』 DB 字节常数表 作用:从指定地址单元开始,定义若干字节的数据,常用于 表格

  5. 例: 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 数或汇编符号 作用:用字符来表示数或汇编符号

  6. 例: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可先使用,后 赋值。

  7. §4.2 汇编语言程序设计 明确要求,确定任务,建立模型 分析问题 找到解决问题的方法 确定算法 是程序设计的一部分,是把 算法转换位程序的准备阶段 流程图 力求简明,层次清晰,编写必要 的注释,方便调试和程序升级 源程序 调试 §4.2.1 汇编程序开发流程

  8. 开始 40H+0C2H N C=1? Y A=01H A=00H A送50H单元 结束

  9. §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

  10. 例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

  11. 例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

  12. §4.2.3 分支结构 特点:程序根据跳转指令程序执行的方向发生变化,分成若 干条不同的分支,主要通过条件转移指令来实现,设 计分支程序的关键是如何判断分支程序的条件。 N 条件真? N 条件真? 条件真? Y Y .... S0 S1 SN S1 S2 S

  13. 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中,编写下列计算式的程序

  14. 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

  15. 例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

  16. 多分支程序设计 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

  17. §4.2.4 循环程序 特点:在要求某一段程序重复执行的时候,用DJNZ指令 实现循环,这可大大简化程序,但指令执行的时间不会减 少。 循环程序流程图: 开始 置循环次数 循环体 N 循环结束? Y 循环体外程序 结束 置循环次数指令: MOV Rn , #XXH (是关键) 判断结束指令: DJNZ Rn , LOOP

  18. 例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

  19. 例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

  20. 例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

  21. §4.2.5 调用子程序 在多次进行相同的计算和操作的时候,为简化程序代码,把 这些相同的动作的指令编写为一特定结构的程序,这个特定 结构的程序称为子程序。 调用指令: LCALL 标号 返回指令: RET

  22. 例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

  23. §4.2.6 程序设计小结 必须找到程序设计的感觉,通过不断的练习建立独立编写符 合要求的程序: 方法: 1、先读简单完整程序 2、记住程序 3、试背写程序 4、在一阶段后独立写简单程序 5、通过上机调试来加强对指令过程的理解

  24. 程序设计小结----巩固练习 例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

  25. 例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

  26. 例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

  27. 例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

  28. 例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

  29. 例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

  30. 例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

  31. 本章内容全部结束,请大家熟练掌握程序设计的思想与方法为后续课程奠定良好基础!本章内容全部结束,请大家熟练掌握程序设计的思想与方法为后续课程奠定良好基础!

More Related