程序设计的其他方法和技术.ppt

上传人:小飞机 文档编号:6011252 上传时间:2023-09-14 格式:PPT 页数:84 大小:207.50KB
返回 下载 相关 举报
程序设计的其他方法和技术.ppt_第1页
第1页 / 共84页
程序设计的其他方法和技术.ppt_第2页
第2页 / 共84页
程序设计的其他方法和技术.ppt_第3页
第3页 / 共84页
程序设计的其他方法和技术.ppt_第4页
第4页 / 共84页
程序设计的其他方法和技术.ppt_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《程序设计的其他方法和技术.ppt》由会员分享,可在线阅读,更多相关《程序设计的其他方法和技术.ppt(84页珍藏版)》请在三一办公上搜索。

1、1.字符串操作2.宏功能程序设计3.模块化程序设计,5.1.2 串操作指令,(1)MOVS(Move String):串传送 语法格式:MOVSBMOVSW MOVS OPD,OPS 功能描述:MOVS(B/W)将DS:SI所指源串的1个元素(字节/字)复制到ES:DI所指的内存单元。然后,SI和DI增加或减少1/2。若DF=0,则增加,否则减少。对标志位的影响:无。,(2)CMPS(Compare Strings):串比较 语法格式:CMPS OPD,OPSCMPSBCMPSW功能描述:CMPS(B/W)将DS:SI所指源串的1个元素(字节/字)与ES:DI所指目的串的1个元素(字节/字)进

2、行比较,根据比较结果设置标志位。然后,SI和DI增加或减少1/2。若DF=0,则增加,否则减少。对标志位的影响:同CMP。,5.1.2 串操作指令,(3)SCAS(Scan String):串扫描 语法格式:SCAS OPDSCASBSCASW 功能描述:SCAS(B/W)将AL/AX与ES:DI所指目的串的1个字节/字进行比较,根据比较结果设置标志位。然后,DI增加或减少1/2。若DF=0,则增加,否则减少。,5.1.2 串操作指令,(4)LODS(Load String):串装入 语法格式:LODS OPSLODSBLODSW功能描述:LODS(B/W)将DS:SI所指源串的1个元素(字节

3、/字)复制到AL/AX。然后,SI增加或减少1/2/4。若DF=0,则增加,否则减少。对标志位的影响:无。,5.1.2 串操作指令,(5)STOS(Store String):串存储 语法格式:STOS OPDSTOSBSTOSW功能描述:STOS(B/W)将AL/AX的值复制到ES:DI所指的内存单元。然后,DI增加或减少1/2。若DF=0,则增加,否则减少。对标志位的影响:无。,5.1.2 串操作指令,(6)重复前缀REP;当CX 0时,重复执行后面的串指令;每执行1次,CX=CX 1;只能用在MOVS、LODS或STOS(B/W)之前REPZ/REPE;当CX 0且ZF=1时,重复执行后

4、面的串指令;每执行1次,CX=CX 1;只能用在CMPS(B/W/D)或SCAS(B/W)之前REPNZ/REPNE;当CX 0且ZF=0时,重复执行后面的串指令;每执行1次,CX=CX 1;只能用在CMPS(B/W/D)或SCAS(B/W)之前说明:若CX初值为0,则不执行任何操作,而且标志位不变。,5.1.2 串操作指令,1.串指令的共性源串:地址由DS:SI表示。目的串:地址由ES:DI表示。自动修改地址:每次数据操作后,SI和DI自动递增或递减,取决于操作的数据类型(字节、字)以及DF的值。若DF=0,则SI和DI自动增加1、2。否则,减1、2。可以使用CLD或STD指令设置DF。计数

5、器:使用重复前缀时,由CX表示数据个数,每重复1次操作,CX减1。,5.1.1 串操作指令简介(总结),2.串指令的用途串指令主要用于处理连续的内存单元,与重复前缀配合使用更有效。例如:MOVS用于将一个内存块的数据复制到另一块;CMPS用于比较两个内存区的数据;SCAS可以在一个内存区中扫描与给定值首次匹配或不匹配的元素;STOS能将一个内存区的所有单元初始化为给定值。LODS一般不用重复前缀。,5.1.1 串操作指令简介(总结),5.1 字符串操作实例,例1 将以STR1为首址的字节存储区中存放的字符串传送到以STR2为首址的字节存储区。,DATA SEGMENTSTR1 DB ABCDE

6、FGHIGKLLCOUNT=$-STR1STR2 DB COUNT DUP(0)DATA ENDSSTACK SEGMENT STACKDB 100 DUP(0)STACKENDS CODESEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK,BEGIN:MOVAX,DATAMOVDS,AXMOVES,AXLEASI,STR1LEADI,STR2MOVCX,COUNTCLDREPMOVSBMOVAH,4CHINT21HCODEENDSEND BEGIN,5.1 字符串操作实例,例2 从键盘输入一字符串至STR1为首址的字节缓冲区,试比较该串与字节字符串S

7、TR2是否相等,若相等,那么0BX;否则,0FFFFHBX。,5.1 字符串操作实例,例3 在字符串STR中搜索子串AM,出现的次数送入BX。,P:REPNE SCASB JE AJMP OUT1A:CMP BYTE PTR DI,MJNE BINC BXB:CMP CX,0JNE POUTA:,5.1 字符串操作实例,例5 在TAB命令存储区中存放着若干条命令,其中每条命令的前一个字节存放着命令串的长度加1,后面一个字存放着该命令处理子程序的入口地址。设计一命令解释程序,其功能为:检查用户输入的命令,如果在TAB存储区能查到该命令,则转入相应的命令处理子程序执行;如果查不到,则给出错误提示后

8、再输入;如果用户未输入命令,则退出本程序的执行。,TAB:DB 4,DIRDW DIRDB 7,RENAMEDW RENAMEDB 4,DELDW DELDB 5,COPYDW COPY,5.2 宏功能程序设计,8086宏汇编语言提供的宏功能主要包括:宏指令的定义与调用、重复汇编和条件汇编等。宏指令允许用户为重复的语句序列定义一个名字,然后在程序中用这个名字代替这个语句序列,并允许传递多个参数,参数传递方式比子程序简单。宏指令的使用步骤:1.宏定义:MACRO、ENDM;2.宏调用;3.宏扩展。,5.2.1 宏定义,格式:宏指令名MACRO 形参表宏体ENDMMACRO:宏定义的开始;宏指令名

9、:宏定义为宏指令序列规定的名称;形参:个数不限,但字符个数不得超过132个,形参间用逗 号隔开;宏体:宏指令代替的程序段,由一系列机器指令语句和伪指令语句组成;ENDM:表示宏定义的结束,与MACRO成对出现。,5.2.1 宏定义,注意事项:宏指令一定要先定义后调用,因此,宏定义一定要放在它的第一次调用之前;宏指令名可以与伪指令、机器指令的助记符同名且具有比机器指令、伪指令更高的优先级。当它们同名时,宏汇编程序将它们一律处理成相应的宏扩展。,5.2.1 宏定义,例:某程序中要经常输出缓冲区中的字符串,通过反复进行9号DOS功能调用完成:LEA DX,BUF1MOVAH,9INT 21HLEA

10、DX,BUF2MOVAH,9INT 21H,WRITEMACRO ALEA DX,AMOV AH,9INT 21H,可定义为宏,5.2.2 宏调用,格式:宏指令号 实参表注意:实参要与宏定义中的形参按位置关系一一对应。如果实参的个数多于形参个数,多余的实参被忽略;如果实参少于形参,则缺少的实参被处理为空白。例如,对前面的宏定义可按下面的形式调用:WRITE BUF1WRITE BUF2,5.2.3 宏定义与宏调用中的参数,一、带间隔符的实参在宏调用中,有时实参是一串带间隔符(如空格、逗号等)的字符串,为了防止混淆,应该用尖括号将它们括起来,尖括号中的内容为一个实参。例如对堆栈段的宏定义:,ST

11、ACKM MACRO ASTACKSEGMENT STACKDB ASTACKENDSENDM,5.2.3 宏定义与宏调用中的参数,一、带间隔符的实参在当前程序中,需要建立一个500字节、初值均为0的堆栈段,宏调用为:相应的宏扩展为:,STACKM 500 DUP(0),+STACKSEGMENT+STACK+DB 500 DUP(0)+STACKENDS,5.2.3 宏定义与宏调用中的参数,二、数字参数在某些情况下,需要以实参符号的值而不是符号本身来替换形参,这种参数的替换称数字参数的替换。特殊宏操作符%将其后的表达式转换成它所代表的数值,并将此数值的ASCII码字符嵌入到宏扩展中。例如:,

12、DATA1MACRO A,B,C,DDW A,B,CDB D DUP(0)ENDM,5.2.3 宏定义与宏调用中的参数,二、数字参数如果宏调用为:,DW 12,5,30 DB 15 DUP(0)DW X+2,5,X+YDB Y-5 DUP(0),X=10Y=20DATA1%X+2,5,%X+Y,%Y-5DATA1 X+2,5,X+Y,Y-5,则相应的宏扩展为:,5.2.3 宏定义与宏调用中的参数,三、宏参数的连接在宏定义中,有些形参夹在字符串中,为了将这种形参标识出来,需在这样的形参前面加符号&,如果形参后面还跟有字符串,则还应在形参后面加符号&。例如:,SHIFTMACRO A,B,CMOV

13、 CL,AS&B C,CLENDM,5.2.3 宏定义与宏调用中的参数,三、宏参数的连接如果宏调用为:,MOV CL,4SALAX,CLMOVCL,2SARBH,CL,SHIFT 4,AL,AXSHIFT 2,AR,BH,则相应的宏扩展为:,5.2.3 宏定义与宏调用中的参数,四、宏体中的变量与标号在宏定义中,常常需要定义一些变量与标号。当这些宏定义在同一程序中多次调用并扩展后,会出现变量或标号重复定义的错误。例如:,SUMMACRO A,BMOV CX,AMOV BX,BMOV AX,0NEXT:ADD AX,BXADD BX,2LOOP NEXTENDM,5.2.3 宏定义与宏调用中的参数

14、,四、宏体中的变量与标号如果宏调用为:,MOV CX,50MOV BX,1MOV AX,0NEXT:ADD AX,BXADD BX,2LOOP NEXT,SUM50,1SUM20,10,则相应的宏扩展为:,MOV CX,20MOV BX,10MOV AX,0NEXT:ADD AX,BXADD BX,2LOOP NEXT,5.2.3 宏定义与宏调用中的参数,四、宏体中的变量与标号为避免宏扩展后出现变量或标号重复错误,8086宏汇编语言了伪指令LOCAL来解决这一问题。语句格式:LOCAL形式参数,形式参数功能:在宏扩展时,汇编程序自动为其后的形参生成特殊符号(?0000?FFFF),并用这些特殊

15、符号来取代宏体中的形参。注意:LOCAL语句只能作为宏体的第一条语句。,5.2.3 宏定义与宏调用中的参数,四、宏体中的变量与标号对于前面求若干个奇数(偶数)各的宏定义,可以改写为如下形式:,SUMMACRO A,BLOCAL NEXTMOV CX,AMOV BX,BMOV AX,0NEXT:ADD AX,BXADD BX,2LOOP NEXTENDM,MOV CX,50MOV BX,1MOV AX,0?0000:ADD AX,BXADD BX,2LOOP NEXT,MOV CX,20MOV BX,10MOV AX,0?0001:ADD AX,BXADD BX,2LOOP NEXT,5.2.6

16、 宏库的使用,一、宏库的定义对于经常使用的宏定义,可将它们集中在一起,供随时调用,例如建立宏库MACRO.LIB:,READMACRO ALEA DX,AMOV AH,10INT 21HENDMWRITE MACRO ALEA DX,AMOV AH,9INT 21HENDM,5.2.6 宏库的使用,二、宏库的使用当程序中需要调用时,首先将宏库加入自己的源文件,然后按宏库中各宏定义的规定调用。语句格式:INCLUDE 文本文件名功能:将指定的文本文件从本行起加入汇编,直到该文本的最后一行汇编完后,再继续汇编INCLUDE后面的语句。,5.2.6 宏库的使用,二、宏库的使用示例:从键盘输入一串字符

17、到BUF缓冲区,将其中的小写字母转换成大写字母(其余字符不变)后仍在显示器上输出。实现方案:利用MACRO.LIB中的宏定义READ、OUT1、CRLF实现字符串的输入、显示一个字符、输出回车换行。,READMACRO ALEA DX,AMOV AH,10INT 21HENDMCRLFMACROMOV AH,2MOV DL,0AHINT 21HMOV DL,0DHINT 21HENDMOUTCHMACRO AMOV DL,AMOV AH,2INT 21HENDM,STACKMMACRO ASTACKSEGMENT STACKDB ASTACKENDSENDM,文件MACRO.LIB中的宏定义:

18、,INCLUDE MACRO.LIBDATASEGMENTBUFDB 79DB 0DB 80 DUP(0)DATAENDSSTACKMCODESEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AXREAD BUFLEA SI,BUF+2MOV CL,BUF+1MOV CH,0,CLDCRLFY1:LODSBCMP AL,aJB Y2CMP AL,zJA Y2SUB AL,20HY2:OUTCH ALLOOP Y1CRLFMOV AH,4CHINT 21HCODEENDSEND START,利用宏定义实现题目要求的功能:,

19、5.2.7 宏指令与子程序的比较,处理时间不同:宏指令在汇编期间由宏汇编程序处理,子程序调用是在目标程序执行期间由CPU直接执行。处理方式不同:宏指令必须先定义、后调用,宏调用是用宏体置换宏指令名,实参置换形参,汇编结束,宏定义也随之消失。子程序调用不发生代码和参数的置换。目标程序的长度不同:宏指令导致目标程序长,占用空间大;而子程序无论调用多少次,子程序的目标代码仅出现一次,因此目标程序短,占用存储空间小。,5.2.7 宏指令与子程序的比较,执行速度不同:调用子程序需要使用堆栈保护和恢复现场,需要专门的指令传递参数,因此执行速度慢;宏指令不存在这些问题,因此执行速度快。参数传递方式不同:宏调

20、用可实现参数的置换,参数的形式不受限制,简单、方便、灵活,不容易出错;而子程序的参数一般为地址或操作数,传递方式由用户编程时具体安排,参数较多时容易出错。,5.3 模块化程序设计,对大型的复杂问题,如果将整个程序放在一个模块中实现会存在以下问题:无法进行多人合作共同完成任务;影响编程的效率和质量,难以保证程序的可靠性;程序调试困难;调试过程中需要多次汇编,源程序越长,汇编的速度越慢,浪费时间。,5.3 模块化程序设计,正确地解决大型、复杂问题的方法:采用自顶向下、逐步求精的模块化和结构化的设计方法,将一个任务按其需要实现的主要功能分解为若干相对独立的模块,并确定好各模块之间的调用关系和参数传递

21、方式,对其中的公共部分还可以抽出来作为独立的公用子程序模块供大家调用,然后将这些模块分配给各个开发人员,分别编写、调试,最后再将它们的目标模块连接装配成一个完整的系统。,5.3 模块化程序设计,模块划分与设计的参考规则:如果一个程序段被多个模块公用,则它应是一个独立的模块;如果若干个程序段处理的数据是公用的,则这些程序应放在一个模块中;若两个程序段的租用率差别很大,则应分属于两个模块;模块的规模要适当,既不能过大、也不能过小;,5.3 模块化程序设计,模块划分与设计的参考规则:应力求使模块具有通用性;各模块应在功能、逻辑上相互独立,避免用转移语句在模块间转移;各模块间的接口应该简单,要尽量减少

22、公共符号的个数,尽量不共用数据存储单元;每个模块的结构应尽量设计成单入口、单出口的形式。,5.3 模块化程序设计,汇编语言程序设计中使模块化程序设计成为可能的关键可重定位技术和连接程序(LINK),连接程序将多个目标模块连接在一起时,必须要有以下两方面的信息:各模块间的通信方式:一个模块访问其它模块中定义的标号(包括过程名)、变量或常量;各段之间的组合方式:每个模块都可能包含多个段,将多个模块连接在一起时,这些段以什么方式进行组合。这些信息是在编程时,使用伪指令通过宏汇编程序产生的目标文件提供给连接程序。,5.3.1 组合方式,段定义伪指令的完整格式:段名SEGMENT 定位方式 组合方式 类

23、别段名ENDS功能:定义一个段。其定位方式、组合方式、类别为赋给段的属性用方括号括起来表示可以省略,若不省略,各项的顺序不能错,且用空格分隔,类别的引号不能省。,5.3.1 组合方式一、定位方式,从汇编语言的角度来看,8086/8088物理地址的构成:PA=(所在段的段寄存器)左移四位+EA当EA=0时,物理地址的最低四位总是0,即段首地址能被16整除。实际上,连接程序允许段首地址从任何字节开始,或者从某一字开始、或从某一页开始,并由用户自由选择,这就是定位方式的选择。定位方式:是对该段的起始地址所提出的要求,即告诉连接程序,在将各段装配到一起时,前一段放完后,后面的段从什么样的起始边界开始存

24、放。,5.3.1 组合方式一、定位方式,定位方式有四种选择:PARA:从能被16整除的地址开始,即段首PA最低4位为0;WORD:从偶数地址开始,即段首PA最低1位为0;BYTE:可以从任何物理地址开始存放;PAGE:从能被256整除的地址开始,即段首PA最低8位为0;其中PARA为系统隐含的定位方式。,5.3.1 组合方式一、定位方式,例:已知程序中的DATA1段和DATA2段的定义如下,如果这两个段分别为当前数据段和附加数据段,试分析不同的定位方式下连接程序对它们边界的处理方法。DATA1SEGMENTADB 55H DUP(0FFH)DATA1 ENDSDATA2SEGMENTDB 64

25、H DUP(0)DATA2ENDS,5.3.1 组合方式二、类别,段的类别是用单引号括起来的字符串,可以是任何合法的名称。连接程序在进行处理时,将把类别相同的所有段(不一定同名)存放在连续的存储区中,先出现的在前,后出现的在后(但仍然是不同的段)且每段都有自己的起始地址。,5.3.1 组合方式二、类别(例),A SEGMENT DATAB SEGMENT CODEC SEGMENT TOD SEGMENT DATAE SEGMENT TO,A SEGMENT DATAD SEGMENT DATAB SEGMENT CODEC SEGMENT TOE SEGMENT TO,连接后,复习:同名段如

26、何处理?问题:同名不同类别段如何处理?,5.3.1 组合方式二、类别(验证1:同名段),DATA1SEGMENT DB DATA1DATA1ENDSDATA1SEGMENT DB DATA2DATA1ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA1START:MOV AX,DATA1CODEENDSEND START,5.3.1 组合方式二、类别(验证2:不同名同类别段),DATA1SEGMENT D1DB DATA1DATA1ENDSDATA2SEGMENT D1DB DATA2DATA2ENDSCODE SEGMENTASSUME CS:CODE,DS:DAT

27、A1START:MOV AX,DATA1CODEENDSEND START,5.3.1 组合方式二、类别(验证3:同名段不同类别段),DATA1SEGMENT D1DB DATA1DATA1ENDSDATA1SEGMENT D2DB DATA2DATA1ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA1START:MOV AX,DATA1CODEENDSEND START,5.3.1 组合方式三、组合方式,8086只允许同时访问4个段,为简便起见,前面学习时采用的方式:将相同性质的段,如全部代码段、全部数据段,组合在一起成为一个代码段、一个数据段。限制:组合起来的各

28、段总长度必须小于64K。为了解决这一问题,连接程序还提供了其它组合方式,由段定义中的“组合方式”属性指定,包括不选择、PUBLIC、COMMON、“AT表达式”、STACK和MEMORY。,5.3.1 组合方式三、组合方式,不选择:本段与其它段逻辑上不发生关联(隐含方式);PUBLIC:将本段与其它模块中的同名、同类别段按各模块连接的顺序相邻地连接在一起,组成一个物理段,该段大小不能超过64K。STACK:与PUBLIC同样处理,但运行时该段作为堆栈段;COMMN:本段与同名、同类别的其它段具有相同的段首址。即将本段与这些段相覆盖,长度取决于最长的COMMN段;AT 表达式:将本段装在根据表达

29、式求值得到的16位段地址上。MEMORY:将本段定位在被连接在一起的其它所有段之上。,5.3.1 组合方式三、组合方式(例),A SEGMENT PARA PUBLIC SEG1A1 DB 55H DUP(0)A ENDSB SEGMENT PARA COMMON SEG2B1 DB 202H DUP(0)B ENDS END,A SEGMENT PARA PUBLIC SEG1A2 DB 104H DUP(0)A ENDSB SEGMENT PARA COMMON SEG2B2 DB 104H DUP(0)B ENDSC SEGMENTCC DB 100H DUP(33H)C ENDS EN

30、D,5.3.2 通信方式,1.公共符号说明语句格式:PUBLIC 符号,符号功能:说明其后的符号是公共符号,可以被其它模块所引用。2.外部符号说明语句格式:EXTRN 符号:类型,符号:类型功能:说明本模块中需要引用的、由其它模块所定义的符号。其中类型包括:ABS(符号常量)、BYTE、WORD、DWORD、NEAR、FAR,5.3.2 通信方式(例),EXTRNWAN2:FARPUBLICDIV0,COUNTEND START,EXTRNDIV0:WORD,COUNT:WORDPUBLICWAN2,COUNTWAR2PROCFAREND,5.4 源程序综合举例,例1:编写将十六进制代码加密和解密的程序,要求如下:#;显示命令提示符,等待用户键入加密或解密命令。#G:G命令为等待用户从键盘输入待加密的十六进制代码(最后以Z作结束),加密后送入CHAN字节存储区。#J:对CHAN字节存储区中的加密代码解密后送OBJE字节存储区。#:结束操作,返回DOS。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号