第4章 汇编程序设计

上传人:aa****6 文档编号:56889814 上传时间:2018-10-16 格式:PPT 页数:80 大小:1.06MB
返回 下载 相关 举报
第4章 汇编程序设计_第1页
第1页 / 共80页
第4章 汇编程序设计_第2页
第2页 / 共80页
第4章 汇编程序设计_第3页
第3页 / 共80页
第4章 汇编程序设计_第4页
第4页 / 共80页
第4章 汇编程序设计_第5页
第5页 / 共80页
点击查看更多>>
资源描述

《第4章 汇编程序设计》由会员分享,可在线阅读,更多相关《第4章 汇编程序设计(80页珍藏版)》请在金锄头文库上搜索。

1、第4章 MCS-51汇编语言程序设计,4.1 简单程序设计 4.2 分支程序设计 4.3 循环程序设计 4.4 散转程序设计 4.5 子程序和参数传递方法 4.6 查表程序设计 4.7 数制转换 习题与思考题,程序设计是为了解决某一个问题而将指令有序地组合在一起的过程。 程序有简有繁, 但复杂程序往 往是由简单的基本程序所构成的。 本章将通过一些基本程序, 介绍部分常用的程序设计方法。 程序设计的过程大致可以分为以下几个步骤: (1) 编制要解决问题的程序框图。 (2) 确定数据结构、 算法、 工作单元、 变量设定。 (3) 根据所用计算机的指令系统, 按照已编制的程序框图用汇编语言编制出源程

2、序。 (4) 将编制的程序在计算机上调试, 直至实现预定的功能。,一、汇编程序功能,源程序 (汇编指令程序),目标程序 (机器码指令程序),汇编指令与机器码指令有一一对应的关系。 汇编程序是一种翻译程序,将源程序翻译成目标程序。,二、汇编程序的汇编过程 汇编有两种方法:手工汇编、机器汇编。,1、手工汇编: 第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出; 第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移 量代换。,源程序,目标程序,地址,ORG 1000H START:MOV R0,2FH MOV R2,#00H MOV A,R0 MOV R3,A INC R3 SJMP

3、 NEXT LOOP:INC R0 CJNE R0,#44H,NEXT INC R2 NEXT:DJNZ R3,LOOP MOV 2AH,R2 SJMP $ END,第一次汇编,第二次汇编,1000 A82F 1002 7A00 1004 E6 1005 FB 1006 0B 1007 80NEXT 1009 08 100A B644NEXT 100D 0A 100E DBLOOP 1010 8A2A 1012 80FE,A82F 7A00 E6 FB 0B 8005 08 B64401 0A DBF9 8A2A 80FE,2、机器汇编 两次扫描过程。 第一次扫描:检查语法错误,确定符号名字;

4、 建立使用的全部符号名字表; 每一符号名字后跟一对应值(地址或数)。 第二次扫描:是在第一次扫描基础上,将符号地址转换成 地址(代真); 利用操作码表将助记符转换成相应的目标码。,三、伪指令 伪指令是告诉汇编程序,如何汇编源程序的指令。 伪指令既不控制机器的操作,也不能被汇编成机器代码, 故称为伪指令。,1、起始地址伪指令 ORG ORG addr16 用于规定目标程序段或数据块的起始地址, 设置在程序开始处。 2、汇编结束伪指令 END 告诉汇编程序,对源程序的汇编到此结束。 一个程序中只出现一 次,在末尾。,3、赋值伪指令 EQU 告诉汇编程序,将汇编语句操作数的值赋予本语句的标号。 格式

5、: 标号名称 EQU 数值或汇编符号 “标号名称”在源程序中可以作数值使用,也可以作数据地址、 位地址使用。 先定义后使用,放在程序开头。 4、定义字节伪指令 DB 告诉汇编程序从指定的地址单元开始,定义若干字节存储单 元并赋初值。 格式: 标号: DB 字节数据或字节数据表,例、 ORG 1000H PIOI:DW 7654H,40H、12、AB,6、数据地址赋值伪指令 DATA 将表达式指定的数据地址赋予规定的字符名称 格式: 字符名称 DATA 表达式 注:该指令与EQU 指令相似,只是,可先使用后定义, 放于程序开头、结尾均可。,5、定义字伪指令 DW 从指定地址开始,定义若干个16个

6、位数据,高八位存入低地址;低八位存入高地址。,7、定义空间伪指令 DS 从指定地址开始,保留由表达式指定的若干字节空间作 为备用空间。 格式: 标号: DS 表达式 例2、 ORG 1000H DS 0AH DB 71H,11H,11H ;从100BH开始存放 ;71H11H、11H。,注:DB、DW、DS 只能用于程序存储器; 而不能用于数据存储器。,8、位地址赋值伪指令 BIT 将位地址赋予规定的字符名称。 格式: 字符名称 BIT 位地址,例3、 X1 BIT P12 相当于 X1 EQU 92H,程序设计有时是一件很复杂的工作,但往往有些程序结构是很典型的。采用结构化编程时,有规律性极

7、强、简单清晰、容易读写、可靠性高等特点。 根据结构化程序设计的观点,功能复杂的程序结构由基本算法结构组成,基本结构有三种:顺序结构、循环结构和分支结构。,语句 3,语句 2,顺序结构,入口,语句 1,出口,分支结构,入口,条件满足否?,分支 1,出口,Y,N,分支 2,循环结构,入口,处理,修改条件,条件满足否?,Y,出口,N,4.1 简单程序设计 简单程序又称顺序程序。 计算机是按指令在存储器中存放的先后次序来顺序执行程序的。 【例4-1】 两个8位的无符号数相加的和仍是8位。 设内部 RAM的40H、 41H单元中分别存放8位数N1、 N2, 两数相加的结果送42H单元。 程序如下: AD

8、1: MOV R0, #40H ; 设R0为数据指针 MOV A, R0 ; 取N1 INC R0 ; 修改指针 ADD A, R0 ; N1 + N2 INC R0 MOV R0, A ; 存结果 END,【例4-2】 将两个半字节数合并成一个一字节数。 设内部RAM的40H、 41H单元中分别存放着8位二进制数, 要求取出两个单元中的低半字节, 并将其合并 成一个字节后存放在42H单元。 程序如下: ,START: MOV R1, #40H MOV A, R1 ANL A, #0FH ; 取第一个半字节 SWAP A ; 移至高4位 INC R1 XCH A, R1 ; 取第二个字节 AN

9、L A, #0FH ; 取第二个半字节 ORL A, R1 ; 拼字 INC R1 MOV R1, A ; 存放结果 END,以上程序均采用了寄存器寻址方式, 可以方便地取数、 存数。 例4-2 中用XCH A, R1指令, 既取出了数, 又保存了中间结果。,4.2 分支程序设计 在处理实际事务中, 只用简单程序设计的方法是不够的, 因为大部分程序总包含有判断、 比较等情况, 程序将根据判断、 比较的结果转向不同的分支。 下面举两个分支程序的例子。,【例4-3】 两个无符号数比较大小。 设存储单元ST1和ST2中存放着两个不带符号的二进制数, 找出其中的大数存入ST3单元中。 流程图如图4-1

10、所示。,图4-1 两个无符号数的比较流程,程序如下: ST1: EQU 8040H ORG 8000H START1: CLR C ; 进位位清0 MOV DPTR, #ST1 ; 设数据指针 MOVX A, DPTR ; 取第一个数 MOV R2, A ; 暂存于R2 INC DPTR MOVX A, DPTR ; 取第二个数 SUBB A, R2 ; 两数比较 JNC BIG1 XCH A, R2 ; 第一个数大,BIG0: INC DPTR MOVX DPTR, A ; 存大数 RET BIG1: MOVX A, DPTR ; 第二个数大 SJMP BIG0 END,上面程序中, 用减法

11、指令SUBB来比较两数的大小。 由于这是一条带借位的减法指令, 因此在执行该指令前, 应先把进位位清0。 用减法指令通过借位(CY)的状态判别两数的大小, 是两个无符号数比较大小时常用的方法。 设有两数x, y, 执行x-y, 当xy 时, 结果无借位产生, 则CY=0; 反之, 则CY=1, 表示xy。 用减法指令比较大小, 会破坏累加器中的内容, 故做减法前先保存累加器中的内容。 执行JNC指令后, 形成了分支。 执行SJMP指令后, 实现了程序的转移。,【例4-4】 编制计算符号函数 y=SGN(x)的程序。 设自变量x已存入标号为ARE的单元: -128 x127。 y 存入标号为BU

12、F的单元。 流程图见图4-2。,图4-2 计算符号函数流程,源程序如下: ARE EQU 1050H BUF EQU 1060H ORG 1000H START2: MOV DPTR, #ARE MOVX A, DPTR JZ SUL ; x=0, 转 SUL JB ACC.7, NEG1 ; 判x 的符号位 MOV A, #01 ; x0, 1A SJMP FINISH SUL: MOV A, #0 SJMP FINISH NEG1: MOV A, #FFH ; x0, -1A FINISH: MOV DPTR, #BUF MOVX DPTR, A END,4.3 循环程序设计 在程序设计中

13、, 只有简单程序和分支程序是不够的。 因为简单程序每条指令只执行一次, 而分支程序则根据条件的不同, 会跳过一些指令, 执行另一些指令。 它们的特点是, 每一条指令至多执行一次。 在处理实际事务时, 有时会遇到多次重复处理的问题, 用循环程序的方法来解决就比较合适。,循环程序中的某些指令可以反复执行多次。 采用循环程序, 可以缩短程序, 节省存储单元。 当重复次数越多时, 循环程序的优越性就越明显。 但是程序的执行时间并不节省。 由于要有循环准备、 结束判断等指令, 速度要比简单程序稍慢些。 循环程序一般由五部分组成: (1) 初始化部分: 为循环程序做准备。 如设置循环次数计数器的初值、 地

14、址指针置初值、 为循环变量赋初值等。 (2) 处理部分: 为反复执行的程序段, 是循环程序的 实体。,(3) 修改部分: 每执行一次循环体后, 对指针作一次修改, 使指针指向下一数据所在位置, 为进入下一轮处理做准备。 (4) 控制部分: 根据循环次数、 计数器的状态或循环条件等检查循环是否能继续进行, 若循环次数到或循环条件不满足时, 应退出循环, 否则继续循环。 通常(2)、 (3)、 (4)部分又称为循环体。 (5) 结束部分: 分析及存放执行结果。,循环程序的结构一般有两种形式: (1) 先进入处理部分, 再控制循环, 即至少执行一次循环体, 如图4-3(a)所示。 (2) 先控制循环

15、, 后进入处理部分, 即根据判断结果控制循环的执行与否, 有时可以不进入循环体就退出循环程序, 如图4-3(b)所示。,图4-3 循环程序的结构形式,循环结构的程序, 不论是先处理后判断, 还是先判断后处理, 其关键是控制循环的次数。 根据需解决问题的实际情况, 对循环次数的控制有多种: 循环次数已知的,用计数器控制循环; 循环次数未知的, 可以按条件控制循环, 也可以用逻辑尺控制循环。 循环程序又分单循环程序和多重循环程序。 下面举例说明循环程序的使用。,1. 单循环程序 1) 循环次数已知的循环程序 下面举几个循环次数已知的循环程序例子。 【例4-5】 工作单元清0。 在程序设计时, 有时需要将存储器中的部分地址作为工作单元, 存放程序执行的中间值和结果。 工作单元清0工作常常放在程序的初始化部分中。 设有50个工作单元, 其首址存放在DPTR中, 循环次数存放在R2寄存器中, 每执行一次循环, R2的内容减1, 直至R2=0时, 循环程序结束。 流程图见图4-4,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > 教育/培训/课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号