第三章(2)程序设计方法剖析

上传人:今*** 文档编号:107870056 上传时间:2019-10-21 格式:PPT 页数:195 大小:1.71MB
返回 下载 相关 举报
第三章(2)程序设计方法剖析_第1页
第1页 / 共195页
第三章(2)程序设计方法剖析_第2页
第2页 / 共195页
第三章(2)程序设计方法剖析_第3页
第3页 / 共195页
第三章(2)程序设计方法剖析_第4页
第4页 / 共195页
第三章(2)程序设计方法剖析_第5页
第5页 / 共195页
点击查看更多>>
资源描述

《第三章(2)程序设计方法剖析》由会员分享,可在线阅读,更多相关《第三章(2)程序设计方法剖析(195页珍藏版)》请在金锄头文库上搜索。

1、,3.3 汇编语言程序设计的基本方法,3.3.1 程序设计基本步骤 3.3.2 源程序的结构和伪指令 3.3.3 顺序程序 3.3.4 分支程序 3.3.5 循环程序 3.3.6 子程序及过程定义 3.3.7 DOS系统功能调用 3.3.8 字符串处理 3.3.9 宏指令,3.3.1 程序设计基本步骤,汇编语言程序设计的基本步骤,分析问题 确定算法 编写程序 程序的检验 编写说明文件,3.3.1 程序设计基本步骤,1分析问题 对求解问题进行详细的了解和分析,从而将一个实际的问题转化为一个计算机可以处理的问题。即将一个实际问题转化成数学模型。,例如:粉笔盒里有8支白粉笔,2支红粉笔,每支重50克

2、,那么一共重多少克?,分析:每支重50克,8支白粉笔的重量为8*50克,2支红粉笔的重量是2*50克,所以一共重:,8*50+2*50 ;建立数学模型,3.3.1 程序设计基本步骤,2. 确定算法 所谓算法,即使计算机能够实现的有限的解题步骤。,计算机只能进行最基本的算术运算和逻辑运算,要完成较为复杂的运算和控制操作,必须选择合适的算法,这是正确编程的基础。,不同的算法,其具体的解题步骤也不同。,如: 8*50+2*50,算法一: 8*50+2*50 =400+100=500(克),算法二: 8*50+2*50 =(8+2)*50=10*50=500(克),3.3.1 程序设计基本步骤,2.

3、确定算法 算法可以用自然语言、类程序设计语言或流程图来描述。本书主要采用流程图来描述。下面给出几个较为通用的几种符号。,起始和终止框,执行框,判断框,起始和终止框是表示程序的开始和结束的符号,它总是在一个流程图的开头和结尾处。,执行框用来表示完成的某项功能,它可以是一条指令或一段程序,无论哪种情况,该框有一个入口,一个出口,判断框是用来表示程序在此处要根据不同情况形成分支,框内需写明比较的条件,此框有一个入口和两个出口。,3.3.1 程序设计基本步骤,2. 确定算法 算法可以用自然语言、类程序设计语言或流程图来描述。本书主要采用流程图来描述。下面给出几个较为通用的几种符号。,开始,Ax左移3位

4、,(Ax)50,(Bx)50,Bx左移1位,(Ax)(Ax)+(Bx),结束,如: 算法一 8*50+2*50 = 400+100 = 500(克),3. 编写程序 编写程序时采用程序设计语言来实现上面已经确定的算法。本书采用汇编语言编写程序。,3.3.1 程序设计基本步骤,编程汇编语言时需要注意: (1)要详细了解CPU的编程模型、指令系统、寻址方式及有关伪指令 (2)要进行存储空间和工作单元的合理分配 (3)多次使用的程序段可采用子程序或宏指令 (4)尽可能用标号或变量代替绝对地址和常数,3. 编写程序 编写程序时采用程序设计语言来实现上面已经确定的算法。本书采用汇编语言编写程序。,3.3

5、.1 程序设计基本步骤,BUF DB ? MOV Si, 0,开始,Ax左移3位,(Ax)50,(Bx)50,Bx左移1位,(Ax)(Ax)+(Bx),并保存,结束,MOV Ax, 50 MOV Bx, 50 MOV Cx, 3 SHL Ax ,Cx SHL Bx , 1 ADD Ax, Bx MOV BUFSI, Ax,4.程序的检验 程序编好后,必须经过书面的检查和上机调试,以便说明程序是否正确。,3.3.1 程序设计基本步骤,5.编写说明文件 一个完整的软件必须有相应的说明文件,这不仅便于用户使用,也便于对程序的维护和扩充。 说明文件主要应包括: 1. 程序的功能和使用方法 2. 程序的

6、基本结构 3. 所采用的主要算法 4. 程序的必要说明和注意事项,3.3.1 程序设计基本步骤,源程序:文件名.ASM,目标模块:文件名.OBJ,可执行文件:文件名.EXE,应用程序,错误,错误,错误,错误,3.3.2 源程序的结构和伪指令,指令使CPU产生动作,并在程序执行时才处理的语句,即前面的8086指令系统。,例: X1 EQU 2 ;汇编程序执行 X2 DB 3 ;汇编程序执行 MOV AL,X1 ;CPU执行,指令与CPU 的类型密切相关; 伪指令与具体的CPU类型无关,但与汇编程序的版本有关。,伪指令不产生CPU动作,在程序执行前由汇编程序处理的说明性语句,指导汇编操作。,格式:

7、 段名 SEGMENT 定位类型 组合类型 类别 ;语句序列 段名 ENDS,1. 段定义伪指令,3.3.2 源程序的结构和伪指令,例如: (定义一个数据段) DAT1 SEGMENT N DB ? NN DB ? SQU DB 16,25,36,49 DB 64,81,100 DAT1 ENDS,1. 段定义伪指令,3.3.2 源程序的结构和伪指令,段名:是定义的段的名称,其构成规则与语句中的名称一样。 可由字母(az),数字(09)及特殊符号(?、_、$)组成,不分大小写。 必须由字母打头,若名字有圆点,则圆点有必须用作第一个字符,数字不能做第一个字符。 构成字符的字符总数可多达31个,若

8、超过31个字符,则31个字符以后的字符无效。,段名的属性: 段地址和偏移地址,2. 定位类型、,组合类型、,类别。,这三种属性可省略。,【定位类型】,3.3.2 源程序的结构和伪指令,定位类型表示对段的起始边界的要求。其类型有:PAGE、PARA、WORD、BYTE四种。,段寄存器、段地址、段的起始地址,段寄存器:CS、DS、ES、SS,段地址:段地址保存在段寄存器中,为16位。,段的起始地址:一个段的起始的物理地 址。由段地址向左移4位得 到,为20位。,例如: (CS)=2B33H,则代码段起始地址: 2B330H,内存单元,2B330H,2B33:0000H,代码段,【定位类型】,3.3

9、.2 源程序的结构和伪指令,指定逻辑段在主存储器中的边界,缺省时为PARA。 BYTE 段起始地址为一个可用的字节地址 (* * * * *B ) WORD 段起始地址为一个可用的偶数地址 (* * * * *0B ) PARA 段起始地址为一个可用的字地址 (* * * * 0000B ) PAGE 段起始地址为一个可用的页地址 (* * * 0000 0000B ),【 组合类型】 组合类型告诉汇编程序应为连接程序提供本段与其它段的有关信息。组合类型有:PRIVATE、PUBLIC、COMMNO、AT表达式、STACK、MEMORY6种不同的类型。段定义时,如果组合类型省略,默认为NONE

10、类型。 PRIVATE:表示本段与不同模块中的其他段在逻辑上没有关系。连接后各模块中的各段都有自己的段地址。 STACK:说明这个段作为堆栈使用。当段定义中指明了STACK类型后,说明堆栈段已经确定。所以,可执行文件装入内存后段寄存器SS中的已是该段的段地址,堆栈指针SP已经指向栈底。这样,可以省略为这两个寄存器传送初值的指令。,3.3.2 源程序的结构和伪指令,【 类别】 类别给出在连接时组成段组的类别名。类别说明并不能把相同类别的端合并起来,但在连接后形成的装入模块中,可以把它们的位置靠在一起。 如果不写,则表示不需要确定类别。,3.3.2 源程序的结构和伪指令,段定义总结: 1. 段名是

11、不能省略的;但定位类型、组合类型和类别可省略。而且它们的书写顺序不能随意更改。,3.3.2 源程序的结构和伪指令,2. 定位类型省略时默认为PARA类型;组合类型省略时默认为PRIVATE类型;类别省略时,表示不需要类别。,3. 段定义必须有SEGMENT和ENDS伪指令,在同一段中, SEGMENT和ENDS前的段名必须一致。,4. 同一个程序中可出多个段。,一个源程序典型的段结构可为: STACK1 SEGMENT ;定义堆栈段 . STACK1 ENDS,3.3.2 源程序的结构和伪指令,DATA SEGMENT ;定义数据段 . DATA ENDS,DATA1 SEGMENT ;定义数

12、据段 . DATA1 ENDS,CODE SEGMENT ;定义代码段 . CODE ENDS,一个源程序的基本结构为: TITLE ADDING PAGE 60,70,3.3.2 源程序的结构和伪指令,STACK SEGMENT PARA STACK STACK DB 256 DUP(?) TOP LABLE WORD STACK ENDS ;堆栈段,DATA SEGMENT ;数据段 ADR1 DB 54H,76H,12H,00H DB 21H,98H,04H,00H ADR2 DW 4 DUP(?) DATA ENDS,CODE SEGMENT ;代码段 ASSUME CS:CODE,

13、Ds:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS, AX MOV SP, OFFSET TOP,MOV DI, OFFSET ADR1 MOV AX, 4DI ADD AX,DI MOV ADR2, AX MOV AX, 6DI ADC AX ,2DI MOV ADR2+2,AX MOV AH, 4CH INT 21H CODE ENDS END START,2. ASSUME伪指令,格式:ASSUME 段寄存器:段名 ,段寄存器名:段名, . 功能:使段与段寄存器发生联系。,例如: 在源程序中定义了代码段(CO

14、DE), 数据段(DATA1),堆栈段(STACK)和附加段(DATA2),3.3.2 源程序的结构和伪指令,ASSUME CS:CODE,ES:DATA2,DS:DATA1,SS:STACK,格式:ASSUME 段寄存器:名称 ,段寄存器名:名称, . 功能:使段与段寄存器发生联系,格式中,段寄存器可以是:CS,DS,SS,ES。,3.3.2 源程序的结构和伪指令,格式中,名称可以是下列情况: 1. 由伪指令SEGMENT定义的段名。(最常用),2. 表达式:SEG 变量名/标号。 如:ASSUME DS:SEG ADR1,格式:ASSUME 段寄存器:名称 ,段寄存器名:名称, . 功能:

15、使段与段寄存器发生联系,格式中的方括号可以省略。如: ASSUME CS:CODE ;只有一个操作数,3.3.2 源程序的结构和伪指令,如果有,则各个操作数之间要有逗号隔开,如: ASSUME CS:CODE, DE:DATA1, SS:STACK ;各个操作数要有逗号隔开,3.3.2 段装入,例如:ASSUME CS:CODE, DE:DATA1, SS:STACK,但这并不意味着,各个段的段地址已经转入相应的段寄存器 中,段寄存器中的内容除了CS以外,仍需要用程序来送入。,段地址的装入相应的段寄存器: MOV AX, DATA MOV DS, AX ;装入数据段的段地址 MOV AX, STACK MOV SS, AX ;装入堆栈段的段地址,ASSUME伪指令使段与段寄存器发生联系,它告诉汇编程序 各个段寄存器当前分别存放的是哪个段的段地址。,3. 汇编结束END伪指令,格式:END 表达式,1. 该指令标志整个源程序的结束,汇编程序到此结束汇编。 2. 汇编源程序的最后必须有一条END语句。 3. 表达式是该程序运行时的启动地址,它通常是一条可执行语句的标号。,3.3.2 源程序的结构和伪指令,如: CODE SEGMENT ;代码段 ASSUME CS:CODE, Ds:DATA,SS:STACK STAR

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

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