首页计算机计算机工程单片机原理及应用 03 第三章 汇编语言程序设计.pptx

03 第三章 汇编语言程序设计.pptx

页数:38页文件大小:256.0 KB来源: 单片机原理及应用ppt课件

本课件先说明程序与程序设计语言的概念、汇编语言的特点与程序设计步骤,随后依次讲解顺序、分支、循环与子程序四种基本程序结构,每种结构均配有可直接参考的源程序示例,包括BCD码转换、查表、多字节求和与数据排序等典型应用。

汇编语言的基本概念概念讲解页,程序一条指令只能完成有限的功能,要完成比较复杂的功能,就要有一组按一定顺序排列的指令,即程序
程序设计语言要点讲解页,计算机程序设计语言是计算机能够理解和执行的语言
汇编语言概述要点讲解页,用助记符编写的程序设计语言称为汇编语言
查看本课件的文字版(共 38 页,供检索与复制)

第1页:汇编语言的基本概念

  • 汇编语言的基本概念
  • 程序一条指令只能完成有限的功能,要完成比较复杂的功能,就要有一组按一定顺序排列的指令,即程序。程序是指令的有序集合。本章介绍MCS-51单片机的汇编语言程序设计。因为实现某一功能的程序并不是唯一的,程序有简有繁,占用内存单元有多有少,执行时间有长有短,所以我们应根据单片机的指令系统,力求编制简洁、占内存少、执行时间短的程序。在程序设计中,只有精心设计、选择合适的指令和合理的结构,才能达到上述的目标。

第2页:程序设计语言

程序设计语言计算机程序设计语言是计算机能够理解和执行的语言。它随着计算机的诞生而诞生,它随着计算机的发展而发展。迄今为止,计算机的程序设计语言很多,但通常分为机器语言、汇编语言、高级语言三种。1、机器语言是一种直接为计算机识别和执行的机器级语言。有两种表现形式:一种是二进制形式,一种是十六进制形式。机器语言的二进制形式由二进制代码“0”和“1”构成,可以直接存放在计算机存储器内。机器语言的十六进制形式,由十六个数字符0-F组成。机器语言难读、难写、难记、难改,一般不用来编写程序。2、汇编语言是人们用来替代机器语言进行程序设计的语言。由助记符、保留字和伪指令组成。3、高级语言是面向过程和问题并能独立于机器的通用程序设计语言。

第3页:汇编语言概述

  • 汇编语言概述
  • 用助记符编写的程序设计语言称为汇编语言。
  • 汇编语言是面向机器的语言,和CPU有关,不同的CPU的机器有不同的汇编语言;
  • 汇编语言属于低级语言;
  • 程序设计就是编写计算机程序的过程;
  • 特点:用汇编程序设计单片机程序时,对数据的存放、寄存器和工作单元的使用等具体工作要由设计者来安排。而设计高级语言时,这些工作都由计算机自动安排,程序设地者不必过问。

第4页:程序设计步骤

程序设计步骤分析问题确定算法绘制程序流程图分配内存单元编写汇编源代码调试

第5页:程序设计步骤(分析问题)

  • 程序设计步骤
  • 分析问题首先,要对需要解决的问题进行分析,以求对问题有正确的理解,明确任务和要求。例如,解决问题的目的是什么,最终要达到什么要求,现有的条件,已知的数据,对运算精度各速度方面的要求等。
  • 确定算法解决一个问题,常常有几种可选择的方法。从数学角度来描述,可能有几种不同的算法。在编制程序前,先对不同的算法进行分析比较,找出最适宜的算法。

第6页:程序设计步骤

  • 程序设计步骤
  • 绘制程序流程图
  • 程序设计工作往往很复杂,为了把复杂的工作条理化,经常使用流程图使设计思路清晰、直观;(工具Visio)
  • 流程图是一些规定的几何图形,通过带箭头的线条有机地连在一起而组成的,是对程序执行过程的一种形象描述;
  • 椭圆框:表示程序的起始或结束;
  • 矩形框:表示要进行的工作;
  • 菱形框:表示要判断的事情,菱形框的表达式表示要判断的内容;
  • 圆圈:表示连接点;
  • 流程线:表示程序的走向;
  • 子程序框:表示调用子程序。准备开始/结束判断调用过程

第7页:程序设计步骤(分配内存单元)

  • 程序设计步骤
  • 分配内存单元分配内存单元,确定程序和数据区的其实地址;
  • 编写源程序按流程图要求编写指令,所编程序力求简洁明了,层次清晰,运算迅速,少占内存。
  • 调试程序程序编制好后,必须经过上机调试检查。先将汇编程序通过汇编生成目标程序,消除语法错误;再可以通过仿真软件模拟调试,如观看寄存器的值的变化;最后在实际系统进行联调,直到达到预定要求。

第8页:程序设计基本技术

程序设计的基本技术顺序程序设计1分支程序设计2循环程序设计3子程序设计4

第9页:程序设计基本技术(顺序程序)

  • 程序设计的基本技术
  • 顺序程序:是最简单的程序,它的执行顺序和程序中指令的排列顺序完全一致。
  • 分支程序:执行顺序和指令存储顺序失去了完全的一致性。把不同的处理方法编制成各自的处理程序,运行时由计算机根据不同的条件自动做出选择判别,绕过某些指令,仅执行相应的处理程序段。
  • 循环程序:重复地执行某些指令。“先执行,后判断”;“先判断,后执行”两种。
  • 子程序:不同的程序中或同一个程序中的不同位置常常用到功能完全一致的程序段。这种被独立出来的程序段被称为子程序。

第10页:3.1 顺序程序设计

  • 3.1顺序程序设计
  • 顺序结构流程图准备结束过程1过程2例:将内部RAM 40H单元中一压缩BCD数转换为二进制数。关键知识点:
  • 压缩BCD数:例,98H表示10进制数98。十位9存放在40H的高4位,个位8存放在40H的低4位;
  • 十位乘以10,再加上个位,为二进制数,即可实现转换;
  • 100的10进制数,为二进制的64H;

第11页:3.1 顺序程序设计(BCD转二进制)

3.1顺序程序设计 MOVA, 40H;将BCD数的十位放A的低4位 SWAPAANLA, #0FHMOVB, #10MULAB;十位乘以10ANL40H, #0FH;将BCD数的个位保留在40H单元中 ADDA, 40H;10位乘以10加个位 MOV40H, A

第12页:3.1 顺序程序设计

  • 3.1顺序程序设计例:设一个非压缩BCD数(0~9)放在内部RAM 60H单元中,求其平方值并放入内部RAM 61H单元中。关键知识点:
  • 查找表方法实现,运算速度快。
  • 0~9的平方值,建表放入存储器(划分)中;最大值81,用BCD数构造,均为1个字节
  • 因此,平方表的首地址与任意BCD数之和正是该BCD数平方值的存放地址。

第13页:3.1 顺序程序设计(查表程序)

3.1顺序程序设计MOVDPTR, #SQTABMOVA, 60HMOVCA, @A+DPTRMOV61H, A…SQTAB: DB 0,1,4,9,16,25,36,49,64,81

第14页:3.2 分支程序设计

3.2分支程序设计分支结构流程图单分支多分支

第15页:3.2 分支程序设计(比较大小示例)

  • 3.2分支程序设计例:内部RAM40H和41H单元中各有一无符号数,比较其大小,将大数存放于内部RAM60H单元,小数存放于内部RAM61H单元,如两数相等,则分别送往这2个单元。要点:
  • 用比较不等转移指令CJNE比较这2个无符号数,先确定它们是否相等,若不相等时在根据借位标志确定这2个数的大小。

第16页:3.2 分支程序设计

3.2分支程序设计 MOVA, 40HMOV61H, 41HCJNEA, 41H, $+3JNCAGEQ;A≥(41H)则无借位 XCHA, 61H;A<(41H)有借位AGEQ: MOV60H,A;A与(61H)交换 SJMP$ END

第17页:3.2 分支程序设计(程序示例)

3.2分支程序设计 MOV A, 40HMOV B, 41HCJNE A, B, NOT_ EQUMOV 61H, A;相等 MOV 60H, AAJMP DONENOT_ EQU: JC SMALLMOV 60H, A;大于 MOV 61H, BAJMP DONESMALL: MOV 61H, A;小于 MOV 60H, BDONE: SJMP $

第18页:3.3 循环程序设计

3.3循环程序设计循环结构流程图先执行,后判断先判断,后执行循环控制

第19页:3.3 循环程序设计(多字节求和)

  • 3.3循环程序设计例:计数控制的循环程序有20字节无符号数存放在内部RAM50H开始的单元中,求它们的和,将和放内部RAM4EH和4FH单元中。要点:
  • 加法共计进行20次,用R7计数,用R0间(接寻)址。4EH和4FH两单元既存放最终结果也存放中间结果,开始时将它们清零。

第20页:3.3 循环程序设计

3.3循环程序设计 MOV4EH, #0MOV4FH, #0MOVR7, #20;设置计数器 MOVR0, #50;设置间接地址指针LOOP: MOVA, 4FHADDA, @R0;加一单元的内容 MOV4FH, ACLRAADDCA,4EH;加累加时产生的进位,存在4EH中 MOV4EH, AINCR0;修改间址指针 DJNZR7,LOOPSJMP$ END

第21页:3.3 循环程序设计(求和程序)

3.3循环程序设计 MOV 4EH, #0MOV 4FH, #0MOV R0, #50H;设置间接地址指针 MOV R7, #20;设置计数器LOOP: MOV A, @R0ADD A, 4FH;加一单元的内容 MOV 4FH, AMOV A, #0HADDC A, 4EH;加累加时产生的进位,存在4EH中 MOV 4EH, AINC R0;修改间址指针 DJNZ R7, LOOPSJMP $

第22页:3.3 循环程序设计

3.3循环程序设计例
条件控制的循环程序将内部RAM 30H中的无符号数转换为十进制数,结果放入R6和R7中。要点:

第23页:3.3 循环程序设计(十进制转换程序)

3.3循环程序设计 MOV31H, #0;31H~33H 3单元清零 MOV32H, #0MOV33H, #0MOVR0, #33H;设置间址寄存器 MOVA, 30H;无符号数送ALOOP: MOVB, #10;置除数10CJNEA, #0,NEZ;被除数为0? MOVA, 32H;为0,将31H~33H中的ASCII BCD数 SWAPA;拼为压缩BCD数放入R6和R7中 ORLA, 33HMOVR7, AMOVR6, 31HSJMP$NEZ: DIVAB;被除数不为0,除以10MOV@R0, B;存余数,逐渐存入33H~31HDECR0;修改间址指针 SJMPLOOPEND

第24页:3.3 循环程序设计

3.3循环程序设计 MOV 31H, #0;31H~33H 3单元清零 MOV 32H, #0MOV 33H, #0MOV R0, #33H;设置间址寄存器 MOV A, 30H;无符号数送ALOOP: JZ DONE;被除数为0MOV B, #10;置除数10DIV ABMOV @R0, BDEC R0SJMP LOOPDONE: MOV A, 32H;为0,将31H~33H中的ASCII BCDSWAP A;数拼为压缩BCD数放入R6和R7中 ORL A, 33HMOV R7, AMOV R6, 31HSJMP $

第25页:3.3 循环程序设计(双重控制循环)

  • 3.3循环程序设计例:双重控制的循环程序把内部RAM中起始地址为30H的字节数据串传送到外部RAM1000H为首地址的区域,直到发现‘$’字符的ASCII码为止。数据串的最大长度为32个字节。要点:
  • 这是计数(32个)控制和条件控制(‘$’)双重控制的循环程序。

第26页:3.3 循环程序设计

3.3循环程序设计 MOVR0, #30H;内部RAM字节串间址指针 MOVDPTR, #1000H;外部RAM字节串间址指针 MOVR7, #32;设置计数循环计数器LOOP: CJNE@R0, #‘$’,ISO;是‘$’吗?不是转移去ISOSJMP$;是,结束ISO: MOVA, @R0;从内部RAM中取数 MOVX@DPTR,A;送外部RAMINCR0;修改内部RAM间址指针 INCDPTR;修改外部RAM间址指针 DJNZR7,LOOP;已传送32个吗?没有,循环 SJMP$;传送32个,结束 END

第27页:3.3 循环程序设计(程序示例)

3.3循环程序设计 MOV R0,#30H;内部RAM字节串间址指针 MOV DPTR,#1000H;外部RAM字节串间址指针 MOV R7,#0;设置计数循环计数器LOOP: MOV A, @R0CJNE A,#'$',NOT_ EQU;是‘$’吗?不是转移去NOT_ EQUAJMP FINISH;是,结束NOT_ EQU: MOVX @DPTR,A;送外部RAMINC R0;修改内部RAM间址指针 INC DPTR;修改外部RAM间址指针 INC R7;修改计数值 CJNE R7, #32, LOOP;已传送32个吗?没有,循环FINISH: SJMP $;传送32个,结束

第28页:3.3 循环程序设计

  • 3.3循环程序设计例:编制将连续存放在内部RAM20H为首地址存储器区域中的n各无符号字节数据的排序的程序。要点:
  • 排序问题可以采取逐一比较法和两两比较法。

第29页:3.3 排序过程示意(逐一比较法)

3.3循环程序设计1348957620111489576203113895762041134957620811348576209113485762091134857620911348576209113485762099134857620

第30页:3.3 循环程序设计(程序示例)

3.3循环程序设计逐一比较法: MOVR0, #20H;R0指向数据区 MOVR7, #19;置外循环计数器R7,(n=20)OUT: MOVR6, R7;置内循环计数器R6PUSH00H;0组的R0进栈 MOVA, @R0;取内循环环间址指针IN: INCR0MOVB, @R0CJNEA, B, $+3;比较A≥@R0? JNCNXCHG;大于等于不交换 XCHA, @R0;小于交换NXCHG: DJNZR6,IN;判断内循环是否结束 POP00H;内循环结束R0出栈 MOV@R0,A;存内循环的最大值 INCR0;修改外循环间址指针 DJNZR7,OUT;判断外循环是否结束? SJMP$ END

第31页:3.3 循环程序设计(逐一比较法程序二)

3.3循环程序设计 MOV R0, #20H;R0指向数据区 MOV R7, #19;置外循环计数器R7,(n=20)OUT: MOV R6, 07H;置内循环计数器R6MOV A, @R0;取外循环间址指针 MOV R1, 00HINC 01H;取内循环间址指针IN: MOV B, @R1CJNE A, B, NOT_ EQUAJMP OVERNOT_ EQU: JC SMALLAJMP OVERSMALL: XCH A, @R1OVER: INC R1DJNZ R6, INMOV @R0, AINC R0DJNZ R7, OUTSJMP $

第32页:3.3 排序过程示意(冒泡法)

3.3循环程序设计1348957620314895762034189576203481957620348915762034895176203489571620348957612034895762103489576210

第33页:3.3 循环程序设计(冒泡排序程序)

3.3循环程序设计 CLRF0;清交换标志 MOVR7, #19;设置外循环计数器OUT: MOVR0, #20H;R0指向数据区 MOVR7, #19;设置外循环计数器 MOVR6, R7IN: MOVA, @R0;取一数据到AINCR0MOVB, @R0;取下一单元数据到BCJNEA, B,$+3;A≥@R0JNCNEXCHG;大于等于不交换 XCHA, @R0;小于交换 DECR0MOV@R0,AINCR0SETBF0;置交换标志NEXCHG:DJNER6,IN;内循环结束? DECR7;下次的内循环少一次JBCF0, OUT;交换发生继续外循环,并清交换标志 SJMP$;未交换结束循环 END两两比较法

第34页:3.3 循环程序设计(冒泡排序程序二)

3.3循环程序设计OUT: CLR F0;清交换标志 MOV R0,#20H;R0指向数据区 MOV R1,#21H;R1指向数据区 MOV R6,#19IN: MOV A,@R0MOV B,@R1CJNE A,B,NOT_ EQUAJMP OVERNOT_ EQU: JC SMALLAJMP OVERSMALL: XCH A,@R1MOV @R0,ASETB F0OVER: INC R0INC R1DJNZ R6,INJNB F0,FINISHAJMP OUTFINISH: SJMP $两两比较法

第35页:3.4 子程序设计

  • 3.4子程序设计子程序是具有完整功能的程序段。子程序在结构上应具有通用性和独立性,在编写子程序应注意以下几点:
  • 子程序的第一条指令地址称为子程序的入口地址。该指令必须有标号,标号应以子程序的任务定名,以便一看就一目了然;
  • 主程序调用子程序是通过安排在主程序的调用指令实现的,子程序返回主程序必须执行安排在子程序末尾的一条RET返回指令;
  • 主程序调用子程序和子程序返回主程,计算机能自动保护和恢复主程序的断点地址(PC值)。但对于各工作寄存器、特殊功能寄存器和内存单元中的内容,如果需要保护和恢复必须在子程序开头和末尾(RET指令前)安排一些能够保护和恢复它们的指令。

第36页:3.4 子程序设计(求最大值乘积)

  • 3.4子程序设计例:求内部RAM中两个无符号数字节串(串长小于16)的最大值的乘积。要点:
  • 因为要求两个串中的字节数据的最大值,故将查找最大值的程序段编制为子程序。两个字节串均存放在内部RAM中,首地址分别为60H和70H。
  • 入口参数:串首地址存放在R0中,串长度存放在R7中;
  • 出口参数:串中的字节数据的最大值存放在A中。

第37页:3.4 子程序设计

3.4子程序设计 MOVR0, #60HMOVR7, #N6;N6为串长 ACALLMAXMOVB, A;存入一乘数 MOVR0, #70HMOVR7, #N7;N7为另一串长 ACALLMAXMULABMOV5EH,B;乘积的高字节放5EH单元 MOV5FH,A;乘积的低字节放5FH单元 SJMP$ END;子程序,计算较大值MAX: PUSH BCLR AMAX1: MOV B, @R0CJNE A, B, $+3JNC ANCHAMOV A, @R0ANCHA: INC R0DJNZ R7,MAX1POP BRET

第38页:课程结束致谢页

本章内容到此结束,前面各页依次讲解顺序、分支、循环与子程序四种基本程序设计技术。

顶部目录