1 / 61

第 章 汇编语言程序设计

概述. 简单程序. 查表程序. 子程序. 应用举例. 优秀程序评价标准. 分支程序. 循环程序. 第 章 汇编语言程序设计. Single Chip Microcomputer. 本章内容. 程序设计概述—设计语言. 最早人们只能用 机器语言 (二进制)编写程序; 为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为 低级语言 。然后再用汇编系统将其翻译成机器语言,该过程称为 汇编 ; 为了用更接近人的语言编写程序,程序设计师们发明了 高级语言 ,如: BASIC、FORTRAN、PASCAL、

deliz
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. 概述 简单程序 查表程序 子程序 应用举例 优秀程序评价标准 分支程序 循环程序 第章汇编语言程序设计 Single Chip Microcomputer 本章内容

  2. 程序设计概述—设计语言 • 最早人们只能用机器语言(二进制)编写程序; • 为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为低级语言。然后再用汇编系统将其翻译成机器语言,该过程称为汇编; • 为了用更接近人的语言编写程序,程序设计师们发明了高级语言,如: BASIC、FORTRAN、PASCAL、 • C、JAVA 然后再用编译系统将其翻译成机器语言,该过程称为编译; • 机器只能识别机器语言。所以必须用编译系统将高级语言编写的源程序编译成机器语言,用汇编系统将用汇编语言编写的源程序汇编成机器语言; • 由低级或高级语言构成的程序称为源程序,由机器语言构成的程序称作目标程序;

  3. 源程序 目标程序 汇编 低级语言 机器语言 编译 高级语言 机器语言

  4. 程序设计实例引入 • 实例 假设一个班有50个人, 共有3门选修课: • 计算机算法 • 服装CAD设计 • 德语 请找出: • 同时选了三门课的同学;

  5. 计算机算法 服装CAD设计 德语 5 2 4 12 25 12 23 39 25 25 29 29 39 39 问题的解决 • 第一步 如何在计算机中表示选修某门课的所有同学 选修这门人数 学生的学号 这个过程实际上是设计数据结构的问题

  6. 计算机算法 CAD设计 德语 问题的解决 • 第二步 设计思路:找出同时选了三门课的同学 这个过程实际上是设计算法的过程,既构建模型。

  7. 找出第一个学生 N 他选计算机吗? Y N 他选了德语吗? Y N 他选了CAD吗? Y 记录要找的人 N 还有学生吗? Y 结束 下一个学生 第三步:设计流程 重复该过程

  8. 几点启示 • 整体构思; • 构建整体流程框图; • 结构合理,流程清晰,简单明了; • 局部模块化;

  9. 为什么要用流程图? • 符合人进行逻辑思考的习惯 • 计算机从根本上来说,没有任何逻辑性,所以,你必须告诉它,先做什么,后做什么,遇到什么情况又该做什么,等等 • 流程图设计本身是一个逐步求精的过程,最终将任务划分为若干能由机器指令实现的小模块

  10. · · · · · · · · · B A 22H 21H 20H 简单程序设计 结构特点: 按指令的先后顺序依次执行。 例1:将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、22H单元。(假设20H中的BCD码为00110100) 什么是BCD码? 什么是ASII码? 高四位ASII码 0011 低四位ASII码 0011 压缩BCD码 0011 0100

  11. 方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。 方法2:利用半字节交换指令来实现。

  12. 开始 · · · (20H)A · · · · · · 10HB A/B (A中为高4位BCD码,B中为低4位BCD码) PC PC PC PC PC PC PC PC PC B B+30HB A B(22H) 22H A+30HA 21H A(21H) 20H 结束 简单程序例1---方法1 源程序如下: ORG 0000H MOV A,20H MOV B,#10H DIV AB ORL B,#30H MOV 22H,B ORL A,#30H MOV 21H,A SJMP $ 0001 0000 0000 0100 0011 0100 0011 0000 0011 0011 0011 0100 0100

  13. 开始 #20HR0 · · · · · · #30HA · · · A的低4位(20H)的低4位 A PC PC PC PC PC PC PC PC PC PC A(22H) (20H)A 22H 21H A的低4位A的高4位 20H A+30HA R0 A(21H) 结束 简单程序例1---方法2 ORG 0000H MOV R0,#20H MOV A,#30H XCHD A,@R0 MOV 22H,A MOV A,@R0 SWAP A ORL A , #30H MOV 21H, A SJMP $ 源程序如下: 0011 0011 0011 0011 0000 0100 0100 0000 0011 0011 0011 0100 0000 0010 0000

  14. 程序设计概述--基本步骤 • 题意分析 • 画出流程图 • 分配内存及端口 • 编制源程序 • 仿真、调试程序 • 固化程序

  15. · · · · · · · · · · · · A 43H 42H 33H 32H 23H 22H 例2:有两组BCD码分别存放在23H、22H单元和33H、32H单元,求它们的和并送入43H、42H单元中去。(高位在前,低位在后) 分析: 0101 0110 0111 1000 BCD码11H 0001 0001 BCD码83H 1000 0011

  16. 开始 (22H)A (32H)+AA 十进制调整 A(42H) (23H)A (33H)+AA 十进制调整 A(43H) 结束 例2:有两 组BCD码(如:1183H和5678H),分别存放在23H、22H单元和33H、32H单元,求它们的和,并送入43H、42H单元中去。(高位在前,低位在后) 解: 流程图(框图)如何? 请同学们自己绘制流程图。

  17. 开始 (22H)A (32H)+AA 十进制调整 A(42H) (23H)A (33H)+AA 十进制调整 A(43H) 结束 ORG 0000H MOV A,22H ADD A,32H DA A MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,A SJMP $ END 此条加法指令可否改用带进位的(ADDC)?

  18. · · · · · · · · · · · · + A PC PC PC PC PC PC PC PC PC PC PC 43H 42H 33H 32H 23H 22H ORG 2000H CLR C MOV A,22H ADD A,32H DA A MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,A END 1111 1011 0110 1000 0110 0001 0110 0111 0001 0001 1000 0011 0101 0110 0111 1000 0110 0111 1111 1011 0110 1000 0110 0001 0101 0110 0111 1000 0001 0001 1000 0011

  19. P3.4=0? Y N 点亮所有二极管 二极管交叉点亮 分支程序设计 • 结构特点:不一定按指令的先后顺序依次运行程序,程序的流向有两个或两个以上分支,根据指定条件选择程序的流向。 • 如实训程序中采用的分支:

  20. 分支程序的典型实例 • 实例:已知30H单元中有一变量X,要求编写一程序按下述要求给Y赋值,结果存入31H单元。 X+1, X>0 Y = 0 , X = 0 –1 , X<0 • 题意:根据X的不同,程序编写时有三个出口,即有三个分支!!!! 想一想:程序怎么编写?

  21. 分支程序实例---三分支程序 开始 程序框图: XA Y A=0? N Y A>0? N A= –1 A= A+1 存结果 结束

  22. 分支程序实例---三分支程序 最高位为符号位。 源程序如下: ORG 2000H MOV A,30H JZ LP1 ;X = 0,转LP1处理 JNB ACC.7,LP2 ;X>0,转LP2处理 MOV A,#0FFH ;X<0,则Y= –1 SJMP LP1 LP2:ADD A,#01 ;X >0,Y=X+1 LP1:MOV 31H,A ;存结果 SJMP $ ;循环等待,$表示转至 本地址,此方法适用 于一字节的偏移量

  23. 例4.3(P68) 设内部RAM20H单元和30H 单元中分别存放了两个8位的无符号数 X、Y, 若X≥Y 则让P1.0管脚连接的LED亮;若X<Y 则让P1.1管脚连接的LED亮。 分支程序实例---数据比较大小 方法1:两个数据做减法SUBB,可根据借位CY来判断两个数的大小! 方法2:两个数据做比较CJNE,再根据是否相等和借位CY来判断两个数的大小!

  24. 方法1编程: X DATE 20H Y DATE 30H ORG 0000H MOV A,X CLR C SUBB A,Y JC L1 CLR P1.0 SJMP FINISH L1: CLR P1.1 FINISH: SJMP $ END

  25. 方法2编程: X DATE 20H Y DATE 30H ORG 0000H MOV A,X CJNE A,Y,L0 L0:JC L1 CLR P1.0 SJMP FINISH L1: CLR P1.1 FINISH: SJMP $ END

  26. 1.先判断符号位,负数小;正数大. 2.符号相同,则用减法判断是否有借位. 分支程序实例---数据比较大小 **例4.4 两个有符号数的比较。 问题1:如何表示有符号数呢? 问题2:有符号数怎样比较大小?

  27. 教材P68 例4.4 比较20H和30H单元两个有符号数的大小,结果按下述规律显示在实训板上。 (20H)=(30H),P1.0点亮; (20H)(30H),P1.1点亮; (20H)(30H),P1.2点亮;

  28. 开始 N X,Y符号相同? Y X-Y N X=Y? Y X>0? Y Y N CY=1 N X>Y,点亮P1.1 X<Y,点亮P1.2 X=Y,点亮P1.0 结束 例4.4 程序框图

  29. X DATA 20H Y DATA 30H ;伪指令 ORG 0000H MOV A,X XRL A,Y ;X,Y进行异或 JB ACC.7,NEXT1 ;二者符号不同,跳转到NEXT1 MOV A,X ;符号相同 CJNE A,Y,NEQUAL;X≠ Y,跳转到NEQUAL CLR P1.0 ;X=Y,点亮P1.0 SJMP FINISH NEQUAL:JC XXY ;X < Y,转移到XXY SJMP XDY ;否则, X > Y,转移到XDY NEXT1: MOV A,X JNB ACC.7,XDY ;判断X的正、负,正则转移到XDY XXY: CLR P1.2 ;X < Y,点亮P1.2 SJMP FINISH XDY: CLR P1.1 ; X > Y,点亮P1.1 FINISH: SJMP $ END 例4.4 程序清单

  30. 实训项目—简单程序和分支程序 • 简单程序 • 实训4程序1 • P66例4.1 • 分支程序 • 实训4程序2 • P67例4.3 • P68例4.4(选做项目) • P70例4.5(选做项目)

  31. 散转程序 • 散转程序是指通过修改某个参数后,程序可以有三个以上的流向,多用于键盘程序。 • 常用的指令是JMP @A+DPTR,该指令是把16位数据指针DPTR的内容与累加器A中的8位无符号数相加,形成地址,装入程序计数器PC,形成散转的目的地址。 A中内容为8位无符号数 16位地址数 + DPTR A PC

  32. 例: 根据R7的内容,转向各自对应的操作程序(R7= 0,转入OPR0;R7= 1,转入OPR1…R7= n,转入OPRn) 程序清单如下: JUMP1: MOV DPTR,#JPTAB1 ;跳转表首送数据指针 MOV A,R7 ADD A,R7 ;R72A (修正变址值) JNC NOAD ;判有否进位 INC DPH ;有进位则加到高字节地址 NOAD: JMP @A+DPTR ;转向形成的散转地址人口 JPTAB1: AJMP OPR0 ;直接转移地址表 AJMP OPR1 . AJMP OPRn

  33. 循环程序设计 • 结构特点:利用转移指令反复运行需要多次重复的程序段。 • 实例:前面几个实训中用到的延时程序:(DELAY) DELAY: MOV R3, #OFFH DEL2: MOV R4,#0FFH DEL1: NOP NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET • 循环程序的组成: 1. 初始化部分(设定循环次数等)。 2. 循环体(重复执行的部分,用于完成实际操作) 3. 循环控制(不断修改和判别循环变量,直至结束)。 4. 循环结束处理。

  34. #200 #125 循环程序设计 延时程序中延时时间的设定: 源程序: 指令周期 DELAY: MOV R3, #( X )H 2个T机器 DEL2: MOV R4,#( Y )H 2个T机器 DEL1: NOP 1个T机器 NOP 1个T机器 DJNZ R4,DEL1 2 个T机器 DJNZ R3,DEL2 2个T机器 RET 延时时间怎样计算? 指令周期、机器周期T机器与时钟周期T时钟的关系: T机器=12T时钟=121/fosc=1us (假设晶振频率fosc为12M) 延时时间的简化计算结果: (1+1+2)  X  Y 若想延时100ms,只需修改计数初始值,即 (1+1+2) 125200us=100ms

  35. 循环程序设计 1S延时程序 源程序: DELAY: MOV R2, #10 DEL3: MOV R3, #200 DEL2: MOV R4,#125 DEL1: NOP NOP DJNZ R4,DEL1 DJNZ R3,DEL2 DJNZ R2, DEL3 RET

  36. 开始 设循环次数 设循环初值 显示模式字送P1口 显示模式字左移1位 次数-1=0 N Y 教材P75例4.6:编程实现P1口连接的8个LED显示方式如下:从P1.0到P1.7的顺序,依次点亮其连接的LED。 循环程序设计

  37. 子程序实例引入:实训4程序3 ORG 0000H START: MOV R2,#08H ;设置循环次数 MOV A,#0FEH ;送显示模式字 NEXT: MOV P1,A ;点亮二极管 ACALL DELAY RL A ;左移一位,改变显示模式字 DJNZ R2,NEXT ;循环次数减1,不为零,继续点亮 SJMP START ;下面一个二极管 DELAY: MOV R3,#0FFH ;延时子程序开始 DEL2: MOV R4,#0FFH DEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END

  38. 初始化部分 循环体 循环控制 循环结束 书P78例4.8:不同存储区域之间的数据传输: 将内部RAM30H单元开始的内容传送到外部RAM0100H单元开始的区域,直到遇到传送的内容是0为止。 数据传送程序 开始 地址指针R0赋初值 地址指针DPTR赋初值 (R0)->A Y A = 0 N A->(DPTR), 地址指针增1 结束

  39. 查表程序 • 表格是事先存放在ROM中的,一般为一串有序的常数,例如平方表、字型码表等。 • 表格可通过伪指令DB来确定。 • 通过查表指令MOVC A,@A+DPTR MOVC A,@A+PC来实现。 在LED显示和键盘处理程序中将会用到。

  40. P81例4.9 用查表法计算平方(一) ORG 0000H MOV DPTR,#TABLE ;表首地址送DPTR MOV A,#05 ;被查数字05A MOVC A,@A+DPTR ;查表求平方 SJMP $ TABLE:DB 0,1,4,9,16,25,36,49,64,81 END

  41. P81例4.9 用查表法计算平方(二) ORG 0000H 1000H MOV A,#05 ;05 A 1002H ADD A,#02 ;修正累加器A 1004H MOVC A,@A+PC ;查表求平方 1005H SJMP $ 1007H: DB 0,1,4,9,16,25,36,49,64,81 END

  42. 八路彩灯控制程序 要求: (1)D1~D8八个彩灯按规定顺序依次点亮(间隔1秒),最后全量; (2)按规定顺序依次熄灭(间隔1秒),最后全灭; (3)八个灯同时点亮,保持1秒; (4)八个灯同时熄灭,保持0.5秒; 再将第3、4步重复4遍,最后整个程序再重复N遍。 步骤: (1)绘制流程图 (2)编写程序 (3)调试程序

  43. 开始 初始化参数 查表 延时 N 循环次数到否? Y 亮灭4次 N 循环N次到否? Y 结束 参考程序(一) ORG 0000H LJMP MAIN ORG 0100H MAIN:MOV R7,#7 LOOP: MOV R6,#16 MOV R5,#4 MOV DPTR,#TABL MOV R4,#0 LOOP1:MOV A,R4 MOVC A,@A+DPTR MOV P1,A INC R4 LCALL DELAY LCALL DELAY DJNZ R6,LOOP1 LOOP2: MOV P1,#0FFH LCALL DELAY LCALL DELAY MOV P1,#00H LCALL DELAY DJNZ R5,LOOP2 DJNZ R7,LOOP SJMP $ END

  44. 子程序设计 • 在实际问题中,常常会遇到在一个程序中多次用到相同的运算或操作,若每遇到这些运算或操作,都从头编起,将使程序繁琐、浪费内存。因此在实际中,经常把这种多次使用的程序段,按一定结构编好,存放在存储器中,当需要时,可以调用这些独立的程序段。通常将这种可以被调用的程序段称为子程序。 主要内容: 1. 主程序与子程序的关系 2. 子程序嵌套 3. 子程序的调用与返回

  45. 子程序SUB  主程序与子程序的关系 子程序入口地址 主程序MAIN 调用子程序 LCALL SUB  RET 实例:实训13中调用延时程序的过程。P82 例4.10 返回

  46. 开始 送显示初值 设闪烁次数 点亮相应的LED 延时 熄灭相应的LED 延时 N 次数-1=0 Y 初值左移1位 指向下一个LED 实例:LED灯的闪烁点亮(一) ORG 0000H MAIN: MOV A,#0FEH ;送显示初值 LP: MOV R0,#10 ;送闪烁次数 LP0: MOV P1,A ;点亮LED LCALL DELAY ;延时 MOV P1,#0FFH;熄灭灯 LCALL DELAY ;延时 DJNZ R0,LP0 RL A SJMP LP

  47. 子程序嵌套 子程序嵌套(或称多重转子)是指在子程序执行过程中,还可以调用另一个子程序。P83 例4.10 主程序MAIN 子程序SUB1 子程序SUB2   LCALL SUB1 LCALL SUB2    RET RET

  48. ORG 0000H MAIN: MOV A,#0FEH ;送显示初值 COUN: ACALL FLASH ;调闪烁子程序 RL A ;A左移,下一个灯闪烁 SJMP COUN ;循环不止 FLASH: MOV R0,#10 ;送闪烁次数 FLASH1: MOV P1,A ;点亮LED LCALL DELAY ;延时 MOV P1,#0FFH ;熄灭灯 LCALL DELAY ;延时 DJNZ R0,FLASH1 ;闪烁次数不够10次,继续 RET DELAY: MOV R3,#0FFH ;延时子程序 DEL2: MOV R4,#0FFH DEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END 子程序嵌套范例:LED灯闪烁(二)

  49. 子程序的调用与返回 问题:子程序调用、返回到主程序中的正确位置,并接著执行主程序中的后续指令呢? 为了解决这个问题,我们采用了堆栈技术。 PC 21 13 20 13 主程序MAIN 子程序SUB1 子程序SUB2  2100 2200   21 2010 2110 LCALL SUB1 13 LCALL SUB2  2013 2113 20 13   RET RET 堆栈指针SP 堆栈

  50. 子程序设计注意事项 (1)要给每个子程序起一个名字,也就是入口地址的代号。 (2)要能正确地传递参数。即首先要有入口条件,说明进入子程序时,它所要处理的数据放在何处(如:是放在A中还是放在某个工作寄存器中等)。另外,要有出口条件,即处理的结果存放在何处。 (3)注意保护现场和恢复现场。在子程序使用累加器、工作寄存器等资源时,要先将其原来的内容保存起来,即保护现场。当子程序执行完毕,在返回主程序之前,要将这些内容再取出,送还到累加器、工作寄存器等原单元中,这一过程称为恢复现场。 例4.11 查表子程序。 注意:1.入口参数和出口参数的位置 2.现场的保护与恢复。 

More Related