微型计算机原理与接口技术第6章2_第1页
微型计算机原理与接口技术第6章2_第2页
微型计算机原理与接口技术第6章2_第3页
微型计算机原理与接口技术第6章2_第4页
微型计算机原理与接口技术第6章2_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 汇编语言中汇编语言中, ,可进行数值计算的仅有加、减、乘、除、可进行数值计算的仅有加、减、乘、除、移位等最最基本的指令。移位等最最基本的指令。 运用这些基本指令哪怕是完成稍微复杂一些的数值运用这些基本指令哪怕是完成稍微复杂一些的数值计算都是比较困难的。计算都是比较困难的。 要把某一问题分解成能够用加、减、乘、除完成的要把某一问题分解成能够用加、减、乘、除完成的基本操作基本操作, ,然后才能着手编程。然后才能着手编程。 .486DATA SEGMENT USE16XX DD 13572468HYY DD 55667788HSUM DB ?,?,?,?,?DATA ENDSCODE SEGMEN

2、T USE16 ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX MOV SI,OFFSET XX MOV DI,OFFSET YY MOV BX,OFFSET SUM+4 CLC ;C标志清标志清0 MOV CX,4 ;不影响不影响C标志标志EXE格式源程序清单:格式源程序清单:BCD_ADD: MOV AL,SI ;不影响不影响C标志标志 ADC AL,DI DAA ;调整指令调整指令 MOV BX,AL ;不影响不影响C标志标志 INC SI ;不影响不影响C标志标志 INC DI ;不影响不影响C标志标志 DEC BX ;不影响不影响C

3、标志标志 LOOP BCD_ADD ;不影响不影响C标志标志 ADC CL,0 MOV BX,CL CALL DISP MOV AH,4CH INT 21HDISP PROC MOV CX,5 MOV BX,OFFSET SUMLLL: MOV DH,BX ROL DX,4 AND DL,0FH ADD DL,30H MOV AH,2 INT 21H ROL DX,4 AND DL,0FH ADD DL,30H MOV AH,2 INT 21H INC BX LOOP LLL RETDISP ENDPCODE ENDS END BEG 数据处理涉及的面比较宽数据处理涉及的面比较宽, ,其中其中

4、字符串字符串处理和处理和表格表格处理都属处理都属于数据处理范畴于数据处理范畴 数据表由若干表项组成。根据表项的内容可分为无序表和数据表由若干表项组成。根据表项的内容可分为无序表和有序表两种。在无序表中各个表项的数值排列是无规则的有序表两种。在无序表中各个表项的数值排列是无规则的, ,而在有序表中而在有序表中, ,表项是按其数值大小表项是按其数值大小, ,从小到大从小到大, ,或从大到小或从大到小依次排列的。依次排列的。 表格处理涉及到数据查找、插入、删除、排序、数据表转表格处理涉及到数据查找、插入、删除、排序、数据表转换等操作换等操作, ,其中查表是最基本的操作。其中查表是最基本的操作。 查表

5、的方法有顺序查表、计算查表、对半搜索等查表的方法有顺序查表、计算查表、对半搜索等 Eg:Eg:数据查找数据查找 设内存缓冲区从设内存缓冲区从BUFBUF单元开始单元开始, ,有若干单字节有符号数有若干单字节有符号数, ,要求要求找出最大数送找出最大数送MAXMAX单元单元, ,最小数送最小数送MINMIN单元。单元。 编程思路编程思路 :数据查找的关键是进行数据比较数据查找的关键是进行数据比较, ,对于有符号数查找对于有符号数查找, ,其最大数其最大数和最小数都是针对真值数而言的。因此应使用有符号数的比较和最小数都是针对真值数而言的。因此应使用有符号数的比较转移指令。转移指令。 .486DAT

6、A SEGMENT USE16BUF DB 34,56,-1,7FH,-88,200,22,80HCOUNT EQU $-BUFMAX DB ?MIN DB ?DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AX MOV CX,COUNT ;CX=数据个数数据个数 MOV AL,BUF MOV MAX,AL ;假设第一个数是最大数假设第一个数是最大数 MOV MIN,AL ;假设第一个数是最小数假设第一个数是最小数 DEC CX ;CX=比较次数比较次数 MOV BX,OFFSET BUF+1E

7、XE格式源程序清单:格式源程序清单:LAST: MOV AL,BX CMP AL,MAX ;比较比较 JG GREAT CMP AL,MIN JL LESS JMP NEXTGREAT: MOV MAX,AL ;大数大数MAX JMP NEXT LESS: MOV MIN,AL ;小数小数MIN NEXT: INC BX LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG Eg:Eg:字符串搜索字符串搜索 假设从假设从STRINGSTRING单元开始有一源串字符单元开始有一源串字符, ,程序执行后采用人程序执行后采用人机会话方式机会话方式, ,从键盘输

8、入一个任意长度的子串从键盘输入一个任意长度的子串, ,请查找源串中是请查找源串中是否蕴含着键入的子串否蕴含着键入的子串, ,并给出结果信息。并给出结果信息。 设计思路设计思路 : 1.1.子串的长度小于或者等于源串长度时才进行搜索;子串的长度小于或者等于源串长度时才进行搜索; 2.2.搜索的次数应当是源串长度减去子串长度再加搜索的次数应当是源串长度减去子串长度再加1 1; 3.3.用串指令实现主要的比较功能;用串指令实现主要的比较功能; 4.REPE CMPSB ; 4.REPE CMPSB ;然后判断然后判断Z Z标志。标志。CMPSBCMPSB指令执行前应做的准备工作指令执行前应做的准备工

9、作: : 欲进行增址型比较欲进行增址型比较: : 用用CLDCLD指令使方向标志指令使方向标志D=0D=0。源串首地。源串首地 址址DS:SI,DS:SI,目标串首地址目标串首地址ES:DIES:DI。 欲进行减址型比较欲进行减址型比较: : 用用STDSTD指令使方向标志指令使方向标志D=1D=1。源串末地。源串末地 址址DS:SI,DS:SI,目标串末地址目标串末地址ES:DIES:DI。示范:示范: welcome to our universitywelcome to our university ourour 第一次搜索第一次搜索 ourour 第二次搜索第二次搜索 。 ourour

10、 搜索到,停搜索到,停 止搜索止搜索 welcome to our universitywelcome to our university fox fox 第一次搜索第一次搜索 fox fox 第二次搜索第二次搜索 。 fox fox;未搜索到;未搜索到 最多搜索次数最多搜索次数=源串长度源串长度-子串长度子串长度+1用用DOS系统系统0AH号功能调用号功能调用,接受键入的子串接受键入的子串,并限制子串输入的有效长度并限制子串输入的有效长度(不包括回车不包括回车)不超过源串长度不超过源串长度(定义缓冲区时限制)(定义缓冲区时限制) ;FILENAME:6115.ASM .486DISP MAC

11、RO VAR MOV AH,9 MOV DX,OFFSET VAR INT 21H ENDMEXE格式源程序清单:格式源程序清单:DATA SEGMENT USE16DATA SEGMENT USE16STRING DB BASIC FORTRAN_77 C+ FOXPRO JAVASTRING DB BASIC FORTRAN_77 C+ FOXPRO JAVALENS EQU $-STRING ;LENS EQU $-STRING ;源串长度源串长度BUF DB LENS+1 ;BUF DB LENS+1 ;限制子串长度最长为限制子串长度最长为LENSLENS DB ? DB ? DB L

12、ENS+1 DUP(?) ; DB LENS+1 DUP(?) ;预留子串的存储空间预留子串的存储空间NNN DW ?NNN DW ?COUNT DB ?COUNT DB ?MESG1 DB Please Enter.$ MESG1 DB Please Enter.$ MESG2 DB 0AH,- Found ! $MESG2 DB 0AH,- Found ! $MESG3 DB 0AH,- No Found ! $MESG3 DB 0AH,- No Found ! $DATA ENDSDATA ENDSCODE SEGMENT USE16CODE SEGMENT USE16 ASSUME C

13、S:CODE,DS:DATA, ASSUME CS:CODE,DS:DATA,ES:DATAES:DATABEG: MOV AX,DATABEG: MOV AX,DATA MOV DS,AX MOV DS,AX MOV ES,AXMOV ES,AX DISP MESG1 DISP MESG1 MOV AH,0AH MOV AH,0AH MOV DX,OFFSET BUF MOV DX,OFFSET BUF INT 21H ; INT 21H ;接收一个子串接收一个子串 MOV AL,BUF+1MOV AL,BUF+1 CMP AL,0 CMP AL,0 JZ NOFOUND ; JZ NOFO

14、UND ;子串长度为子串长度为0 0转转 MOV BYTE PTR NNN,ALMOV BYTE PTR NNN,AL MOV AH,LENS MOV AH,LENS SUB AH,AL SUB AH,AL INC AH ; INC AH ;计算搜索次数计算搜索次数 MOV COUNT,AH ;MOV COUNT,AH ;搜索次数搜索次数 COUNTCOUNT单元单元 CLDCLD MOV BX,OFFSET STRING MOV BX,OFFSET STRINGAGAIN: MOV SI,BXAGAIN: MOV SI,BX MOV DI,OFFSET BUF+2 MOV DI,OFFSET

15、 BUF+2 MOV CX,NNN MOV CX,NNN REPE CMPSB ; REPE CMPSB ;字符串搜索字符串搜索 JZ FOUNDJZ FOUND INC BX INC BX DEC COUNT DEC COUNT JNZ AGAIN JNZ AGAINNOFOUND: DISP MESG3NOFOUND: DISP MESG3 JMP EXIT JMP EXITFOUND: DISP MESG2FOUND: DISP MESG2EXIT: MOV AH,4CHEXIT: MOV AH,4CH INT 21H INT 21HCODE ENDSCODE ENDS END BEG

16、END BEG串搜索指令串搜索指令scasscas准备工作准备工作: : 欲进行增址型比较欲进行增址型比较: : 用用CLDCLD指令使方向标志指令使方向标志D=0D=0。 要搜索的关键字放入要搜索的关键字放入ALAL、AXAX或或EAXEAX中。中。 目标串首址目标串首址ES:DIES:DI。 欲进行减址型比较欲进行减址型比较: : 用用CLDCLD指令使方向标志指令使方向标志D=1D=1。 要搜索的关键字放入要搜索的关键字放入ALAL、AXAX或或EAXEAX中。中。 目标串末址目标串末址ES:DIES:DI。应用:根据源数据,查找目标数据应用:根据源数据,查找目标数据例:例:用用XLAT

17、指令完成十六进制指令完成十六进制 ASCII码码 的转换,的转换, 并将转并将转换结果显示于屏幕换结果显示于屏幕设计思路:设计思路: 用查表指令需做准备工作用查表指令需做准备工作 查表指令要求,查表时的相对位移量需存入查表指令要求,查表时的相对位移量需存入AL寄存器寄存器 十六进制数有十六进制数有 0 9、 A F, 对应的对应的ASCII码为码为30H39H、41H46H, 如何定义表?如何定义表? .486.486DATA SEGMENT USE16DATA SEGMENT USE16TAB1 DB 30HTAB1 DB 30H,31H31H,32H32H,33H33H,34H34H,35

18、H35H DB 36H DB 36H,37H37H,38H38H,39H39H DB 41H DB 41H,42H42H,43H43H,44H44H,45H45H,46H46HTAB2 DB 0TAB2 DB 0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9 DB 0AH DB 0AH,0BH0BH,0CH0CH,0DH0DH,0EH0EH,0FH0FHDATA ENDSDATA ENDSCODE SEGMENT USE16CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATABEG: MOV

19、AX,DATABEG: MOV AX,DATA MOV DS,AX MOV DS,AXEXE格式源程序清单:格式源程序清单:MOVMOVCXCX,10H10HMOVMOVBXBX,OFFSET TAB1OFFSET TAB1MOVMOVSISI,OFFSET TAB2OFFSET TAB2L1L1:MOVMOVALAL,SISIXLATXLATMOVMOVDLDL,ALALMOVMOVAHAH,2 2INTINT21H21HMOVMOVDLDL, MOVMOVAHAH,2 2INTINT21H21HINCINCSISILOOPLOOPL1L1MOVMOVAHAH,4CH4CHINTINT21H

20、21HCODECODEENDSENDSENDENDBEGBEG什么是什么是“模块模块”?能够独立汇编的一个逻辑段能够独立汇编的一个逻辑段( (例如仅有一个数例如仅有一个数据段据段),),或者是能够独立汇编的若干个逻辑段或者是能够独立汇编的若干个逻辑段的集合的集合, ,就称为一个模块。每个模块都可以有就称为一个模块。每个模块都可以有自己的数据段、附加段、代码段。自己的数据段、附加段、代码段。什么是什么是“模块化程序设计方法模块化程序设计方法”? ?把一个大型程序分解成若干个有相对独立功把一个大型程序分解成若干个有相对独立功能的小程序能的小程序, ,由多人分别设计、调试生成各自由多人分别设计、调试

21、生成各自的的OBJOBJ文件文件,最后由链接程序将它们链接成一,最后由链接程序将它们链接成一个可执行文件。个可执行文件。模块化程序设计模块化程序设计模块化程序结构模块化程序结构1. 主模块和子模块主模块和子模块 只允许有一个主模块只允许有一个主模块, ,其它都是子模块其它都是子模块 子模块用子模块用“END”END”做为本源程序结束语句做为本源程序结束语句 主模块用主模块用“END END 启动指令标号启动指令标号”做为源程做为源程序序 的结束语句的结束语句模块化程序设计模块化程序设计2. 模块之间符号名的引用模块之间符号名的引用 用于模块用于模块间间 转移转移 模块间模块间 调用调用 模块间

22、模块间 互访互访 等一系列跨模块的操作等一系列跨模块的操作模块化程序设计模块化程序设计PUBLICPUBLIC伪指令伪指令 (公用符号名说明语句)(公用符号名说明语句)格式:格式:PUBLIC PUBLIC 符号名符号名,符号名符号名 例如:例如:PUBLIC BEG,NEXT,MESGPUBLIC BEG,NEXT,MESG 功能:功能: 语句右侧列出的符号名是语句右侧列出的符号名是本模块中定义本模块中定义的的变量名变量名、 标号名标号名、过程名过程名, ,它们要它们要被其他的模块引用被其他的模块引用。 用于被调用模块用于被调用模块 通常的做法是通常的做法是PUBLICPUBLIC语句放在定

23、义这些符号名的语句放在定义这些符号名的 模块的上方。模块的上方。模块化程序设计模块化程序设计EXTRNEXTRN伪指令伪指令 (外部符号名说明语句)(外部符号名说明语句)格式格式: EXTRN : EXTRN 符号名符号名: :类型类型,符号名符号名: :类型类型 例如例如: EXTRN BEG:FAR,NEXT:FAR,MESG:BYTE: EXTRN BEG:FAR,NEXT:FAR,MESG:BYTE 功能:语句右侧的符号名是功能:语句右侧的符号名是本模块引用本模块引用的的, ,而在而在其他其他模块中定义模块中定义过的过的变量名变量名、标号名标号名、过程名过程名。 符号名右侧的类型符号名

24、右侧的类型, ,必须是这些符号名在定义时被说明必须是这些符号名在定义时被说明的类型的类型, ,类型说明符有类型说明符有BYTE(BYTE(字节型字节型) )、WORD(WORD(字型字型) )、DWORD(DWORD(双字型双字型) )、FAR(FAR(远远) )、NEAR(NEAR(近近) )。 通常的做法是通常的做法是EXTRNEXTRN语句放在调用模块的上方语句放在调用模块的上方, ,它通知汇它通知汇编程序编程序, ,所列出的符号名所列出的符号名, ,在其他模块中已定义过了在其他模块中已定义过了, ,否则否则汇编时出错。汇编时出错。 用于调用模块用于调用模块模块化程序设计模块化程序设计这

25、两个伪指令提供了模块之间这两个伪指令提供了模块之间互访互访的可能性。的可能性。这两个伪指令的使用必须相这两个伪指令的使用必须相匹配匹配。链接(链接(TLINK)程序的任务之一就是要检查)程序的任务之一就是要检查每个模块中每个模块中EXTRN说明的符号是否与其相连说明的符号是否与其相连的其他模块中的的其他模块中的PUBLIC说明的符号相匹配,说明的符号相匹配,若不匹配,则给出出错信息。若不匹配,则给出出错信息。模块化程序设计模块化程序设计INCLUDEINCLUDE伪指令伪指令 格式:格式: INCLUDE INCLUDE 盘符:盘符: 路径路径 文件名文件名. .扩展名扩展名 功能:功能:通知

26、汇编程序把指定的文件通知汇编程序把指定的文件“拷贝拷贝”一份一份, ,插插入到该语句的下方供汇编时使用。当然入到该语句的下方供汇编时使用。当然, ,当前当前盘的盘符、路径可以省略。盘的盘符、路径可以省略。模块化程序设计模块化程序设计模块化程序的设计考虑模块化程序的设计考虑(1) (1) 合理划分模块合理划分模块, ,使每一个模块有相对独立的功能使每一个模块有相对独立的功能, , 大小适中,尽量减少模块之间的耦合。大小适中,尽量减少模块之间的耦合。(2) (2) 在实模式下在实模式下, ,链接之后的同类型逻辑段不能超过链接之后的同类型逻辑段不能超过 64K64K。(3) (3) 模块之间模块之间

27、, ,同类型逻辑段的组合与否同类型逻辑段的组合与否, ,是重点考是重点考 虑的问题。虑的问题。(4) (4) 模块之间的模块之间的转移和调用转移和调用(5) (5) 模块之间出现符号名引用的时候必须用模块之间出现符号名引用的时候必须用PUBLICPUBLIC 、EXTRNEXTRN语句说明。语句说明。 模块化程序设计模块化程序设计 * *模块之间模块之间, ,同类型逻辑段的组合与否同类型逻辑段的组合与否(1 1)不同模块中的代码段)不同模块中的代码段, ,可以组合成一个统一的代码段可以组合成一个统一的代码段, ,也可以不组合也可以不组合, ,仍旧是各自独立的代码段。仍旧是各自独立的代码段。 (

28、2(2) 不同模块中的数据段不同模块中的数据段( (附加段附加段),),可以组合成一个统可以组合成一个统一的数据段一的数据段( (附加段附加段),),也可以不组合也可以不组合, ,仍旧保持各自的独立仍旧保持各自的独立性。性。 以代码段为例以代码段为例, ,怎样把各模块中的代码段组合成一个统一怎样把各模块中的代码段组合成一个统一的代码段呢?需要采取以下措施:的代码段呢?需要采取以下措施: 各模块的代码段选用各模块的代码段选用相同的段名相同的段名。 在代码段段定义语句中都选用在代码段段定义语句中都选用“PUBLIC”PUBLIC”链接参数链接参数。 以上措施缺一不可。如果选用相同的分类名更好。以上

29、措施缺一不可。如果选用相同的分类名更好。 反之反之, ,如果不采取以上措施如果不采取以上措施, ,则链接后各模块的代码段则链接后各模块的代码段仍旧是各自独立的。仍旧是各自独立的。 模块化程序设计模块化程序设计* *模块之间的转移和调用模块之间的转移和调用 如果各模块之间的代码段如果各模块之间的代码段, ,最后要组合成最后要组合成一个代码段一个代码段, ,那么模块之间的转移就是段内转那么模块之间的转移就是段内转移移, ,可以使用段内转移的各种指令格式;模块可以使用段内转移的各种指令格式;模块之间的子程序调用为近过程调用之间的子程序调用为近过程调用, ,可以使用段可以使用段内调用的各种指令格式。内

30、调用的各种指令格式。 如果链接后的代码段仍然是各自独立的如果链接后的代码段仍然是各自独立的, ,则模块之间转移属于段间转移则模块之间转移属于段间转移, ,模块之间的子模块之间的子程序调用属于远过程调用程序调用属于远过程调用( (被调用的子程序应被调用的子程序应明确写出有明确写出有FARFAR属性属性) ) 模块化程序设计模块化程序设计模块化程序设计举例模块化程序设计举例 设计一个简易的旅游菜单程序设计一个简易的旅游菜单程序, ,主菜单界面如上图所示主菜单界面如上图所示, ,用户键入用户键入“1”,1”,转北京二级菜单转北京二级菜单, ,屏幕中央显示屏幕中央显示“WELCOME TO WELCO

31、ME TO BEIJINGBEIJING!”, ,底部显示底部显示“Please strike any key”,Please strike any key”,用户敲用户敲击任意键之后击任意键之后, ,程序又转而显示主菜单。程序又转而显示主菜单。用户键入用户键入“2”,2”,转南京二级菜单转南京二级菜单, ,屏幕中央显示类似的欢迎词屏幕中央显示类似的欢迎词和提示信息和提示信息。键入。键入“3”,3”,程序结束返回程序结束返回DOSDOS。 CHOICE(1,2,3):): MENU 1. BEIJING 2. NANJING 3. RETURN DOS 模块化程序设计模块化程序设计解法解法1

32、1设计思路与程序分析:设计思路与程序分析:1.1.合理划分模块合理划分模块 程序划分为程序划分为3 3个模块:个模块:主模块主模块6131.ASM6131.ASM显示主菜单显示主菜单, ,并完成菜单项的选择和转移并完成菜单项的选择和转移子模块子模块6131_1.ASM6131_1.ASM显示显示“欢迎到北京来欢迎到北京来”及提示信息及提示信息, ,子模块子模块6131_2.ASM6131_2.ASM显示显示“欢迎到南京来欢迎到南京来”及提示信息。及提示信息。2.2.每一模块中应设置哪些段?每一模块中应设置哪些段? 3 3个模块都有自己的代码段和数据段,段名均不相同。个模块都有自己的代码段和数据

33、段,段名均不相同。3.3.模块之间相同性质的逻辑段如何组合?模块之间相同性质的逻辑段如何组合?模块之间的数据段、代码段不组合模块之间的数据段、代码段不组合, ,均为各自独立的逻辑段。均为各自独立的逻辑段。链接之后,各模块的数据段,代码段仍然相互独立。链接之后,各模块的数据段,代码段仍然相互独立。模块化程序设计模块化程序设计4.4.模块之间的转移和调用方法模块之间的转移和调用方法模块之间的转移是段间转移模块之间的转移是段间转移, ,EXTRNEXTRN语句中对于转移标号语句中对于转移标号, ,均说明为均说明为“FAR”FAR”。5.DS5.DS值的考虑值的考虑 由于各模块有独立的代码段和独立的数

34、据段,由于各模块有独立的代码段和独立的数据段,DSDS寄寄存器必须访问存器必须访问自身模块的数据段自身模块的数据段, ,所以一旦发生模块所以一旦发生模块之间的转移之间的转移, ,DSDS的值必须跟踪变化的值必须跟踪变化, ,否则定会产生逻辑否则定会产生逻辑错误错误( (逻辑错误汇编时发现不了逻辑错误汇编时发现不了) )为此子模块的入口处为此子模块的入口处(BEG1,BEG2)(BEG1,BEG2)都设置了给都设置了给DSDS赋值赋值的指令。的指令。模块化程序设计模块化程序设计 解法解法1 1程序清单程序清单 ;FILENAME:6131.ASM ;FILENAME:6131.ASM .486

35、.486 PUBLIC BEGPUBLIC BEG EXTRN BEG1:FAR,BEG2:FAR EXTRN BEG1:FAR,BEG2:FARDISP MACRO YYXX,VAR DISP MACRO YYXX,VAR MOV AH,2 MOV AH,2 MOV BH,0 MOV BH,0 MOV DX,YYXX MOV DX,YYXX INT 10H INT 10H ;预制光标位置;预制光标位置 MOV AH,9MOV AH,9 MOV DX,OFFSET VAR MOV DX,OFFSET VAR INT 21H INT 21H ENDM ENDM模块化程序设计模块化程序设计DATA

36、0 SEGMENT USE16DATA0 SEGMENT USE16N EQU 28 DUP( )N EQU 28 DUP( )L1 DB N, MENU ,0DH,0AHL1 DB N, MENU ,0DH,0AH DB N, ,0DH,0AH DB N, ,0DH,0AH DB N, 1. BEIJING ,0DH,0AH DB N, 1. BEIJING ,0DH,0AH DB N, 2. NANJING ,0DH,0AH DB N, 2. NANJING ,0DH,0AH DB N, 3. RETURN DOS ,0DH,0AH DB N, 3. RETURN DOS ,0DH,0AH

37、 DB N, ,0DH,0AH DB N, ,0DH,0AHL7 DB N, CHOICE(1,2,3):$ L7 DB N, CHOICE(1,2,3):$ DATA0 ENDSDATA0 ENDSCODE0 SEGMENT CODE USE16CODE0 SEGMENT CODE USE16 ASSUME CS:CODE0,DS:DATA0 ASSUME CS:CODE0,DS:DATA0BEG: MOV AX,DATA0BEG: MOV AX,DATA0 MOV DS,AX MOV DS,AX MOV AX,2 MOV AX,2 INT 10H INT 10H DISP 0500H,L1

38、DISP 0500H,L1AGA: DISP 0B00H,L7AGA: DISP 0B00H,L7 MOV AH,1 MOV AH,1 INT 21H INT 21H CMP AL,3 CMP AL,3 JE EXIT JE EXIT CMP AL,1 CMP AL,1 JE BEG1 JE BEG1 ;段内有条件转移;段内有条件转移 CMP AL,2 CMP AL,2 JE BEG2JE BEG2 JMP AGA JMP AGAEXIT: MOV AH,4CHEXIT: MOV AH,4CH INT 21H INT 21HCODE0 ENDSCODE0 ENDS END BEG END BE

39、G ;此模块为主模块;此模块为主模块;FILENAME:6131_1.ASM;FILENAME:6131_1.ASM .486 .486 PUBLIC BEG1PUBLIC BEG1 EXTRN BEG:FAR EXTRN BEG:FARDISP MACRO YYXX,VARDISP MACRO YYXX,VAR MOV AH,2 MOV AH,2 MOV BH,0 MOV BH,0 MOV DX,YYXX MOV DX,YYXX INT 10H INT 10H MOV AH,9 MOV AH,9 MOV DX,OFFSET VAR MOV DX,OFFSET VAR INT 21H INT

40、21H ENDM ENDMDATA1 SEGMENT USE16DATA1 SEGMENT USE16MESG1 DB WELCOME TO BEIJING ! $ MESG1 DB WELCOME TO BEIJING ! $ ENDMESG DB Please strike any key $ ENDMESG DB Please strike any key $ DATA1 ENDSDATA1 ENDSCODE1 SEGMENT CODE USE16CODE1 SEGMENT CODE USE16 ASSUME CS:CODE1,DS:DATA1 ASSUME CS:CODE1,DS:DA

41、TA1BEG1:BEG1: MOV AX,DATA1MOV AX,DATA1 MOV DS,AX MOV DS,AX MOV AX,2 MOV AX,2 INT 10H INT 10H DISP 0C1EH,MESG1 DISP 0C1EH,MESG1 DISP 171DH,ENDMESG DISP 171DH,ENDMESG MOV AH,1 MOV AH,1 INT 21H INT 21H JMP BEGJMP BEGCODE1 ENDSCODE1 ENDS END END ;子模块结束语句;子模块结束语句 ;FILENAME:6131_2.ASM;FILENAME:6131_2.ASM

42、.486 .486 PUBLIC BEG2PUBLIC BEG2 EXTRN BEG:FAR EXTRN BEG:FARDISP MACRO YYXX,VARDISP MACRO YYXX,VAR MOV AH,2 MOV AH,2 MOV BH,0 MOV BH,0 MOV DX,YYXX MOV DX,YYXX INT 10H INT 10H MOV AH,9 MOV AH,9 MOV DX,OFFSET VAR MOV DX,OFFSET VAR INT 21H INT 21H ENDMENDMDATA2 SEGMENT USE16DATA2 SEGMENT USE16MESG2 DB

43、WELCOME TO NANJING ! $ MESG2 DB WELCOME TO NANJING ! $ ENDMESG DB Please strike any key $ ENDMESG DB Please strike any key $ DATA2 ENDSDATA2 ENDSCODE2 SEGMENT CODE USE16CODE2 SEGMENT CODE USE16 ASSUME CS:CODE2,DS:DATA2 ASSUME CS:CODE2,DS:DATA2BEG2:BEG2: MOV AX,DATA2MOV AX,DATA2 MOV DS,AX MOV DS,AX M

44、OV AX,2 MOV AX,2 INT 10H INT 10H DISP 0C1EH,MESG2 DISP 0C1EH,MESG2 DISP 171DH,ENDMESG DISP 171DH,ENDMESG MOV AH,1 MOV AH,1 INT 21H INT 21H JMP BEGJMP BEGCODE2 ENDSCODE2 ENDS END END ;子模块结束;子模块结束模块化程序可执行文件的生成步骤如下模块化程序可执行文件的生成步骤如下: : 分别对分别对各个模块进行编辑和汇编生成各自的各个模块进行编辑和汇编生成各自的目标文件目标文件( (共享的宏文件只编辑不汇编共享的宏文件只

45、编辑不汇编),),假设解法假设解法1 1的目标文件为:的目标文件为:6131.OBJ,6131_1.OBJ,6131_2.OBJ6131.OBJ,6131_1.OBJ,6131_2.OBJ。 然后用链接程序进行链接:例如:然后用链接程序进行链接:例如: TLINK 6131TLINK 61316131_16131_16131_26131_2 生成的可执行文件与第一个目标文件同名生成的可执行文件与第一个目标文件同名, ,本本例的可执行文件为例的可执行文件为6131.EXE6131.EXE。模块化程序设计模块化程序设计 解法解法2 2设计思路与程序分析设计思路与程序分析 1. 1.合理划分模块合理

46、划分模块 程序划分为程序划分为3 3个模块:个模块:主模块主模块6132.ASM6132.ASM显示主菜单显示主菜单, ,并完成菜单项的选择和转并完成菜单项的选择和转移移子模块子模块6132_1.ASM6132_1.ASM显示显示“欢迎到北京来欢迎到北京来”及提示信息及提示信息, ,子模块子模块6132_2.ASM6132_2.ASM显示显示“欢迎到南京来欢迎到南京来”及提示信息。及提示信息。 2.2.每一模块中应设置哪些段?每一模块中应设置哪些段?主模块设置代码段和数据段,其中数据段集中存放程序主模块设置代码段和数据段,其中数据段集中存放程序中使用的数据。中使用的数据。子模块不设置数据段,分

47、别设置各自的代码段。子模块不设置数据段,分别设置各自的代码段。3 3个模块的代码段都选用了相同的段名个模块的代码段都选用了相同的段名, ,都选用都选用“PUBLIC”PUBLIC”做为链接参数。做为链接参数。模块化程序设计模块化程序设计3.3.模块之间相同性质的逻辑段如何组合?模块之间相同性质的逻辑段如何组合?3 3个模块的代码段个模块的代码段, ,最后要组合成一个统一的代码段。最后要组合成一个统一的代码段。链接程序将不同模块中具有链接程序将不同模块中具有PUBLICPUBLIC属性的同名段,按照属性的同名段,按照指定的连接顺序进行链接,组成一个逻辑段。指定的连接顺序进行链接,组成一个逻辑段。

48、4.4.模块之间的转移和调用方法模块之间的转移和调用方法统一的代码段统一的代码段, ,所以模块之间的转移是段内转移所以模块之间的转移是段内转移EXTRNEXTRN语句中语句中, ,对转移标号用对转移标号用NEARNEAR说明它们是近距离转移说明它们是近距离转移某一个标号既是段内转移的目标某一个标号既是段内转移的目标, ,又是段间转移的目标又是段间转移的目标, ,在这种情况下在这种情况下EXTRNEXTRN语句对于这些标号名、过程名语句对于这些标号名、过程名, ,应当应当写成写成“FAR”FAR”。5.DS5.DS值的考虑值的考虑 由于由于3 3个模块使用一个数据段个模块使用一个数据段, ,因此

49、在主模块完成对因此在主模块完成对DSDS赋赋值之后值之后, ,转入其他模块时不应破坏转入其他模块时不应破坏DSDS的初值。的初值。模块化程序设计模块化程序设计 解法解法2 2程序清单程序清单 ;FILENAME:6132.ASM ;FILENAME:6132.ASM .486 .486 PUBLIC BEG,MESG1,MESG2,ENDMESGPUBLIC BEG,MESG1,MESG2,ENDMESG EXTRN BEG1:NEAR,BEG2:NEAR EXTRN BEG1:NEAR,BEG2:NEARDISP MACRO YYXX,VARDISP MACRO YYXX,VAR MOV A

50、H,2 MOV AH,2 MOV BH,0 MOV BH,0 MOV DX,YYXX MOV DX,YYXX INT 10H INT 10H MOV AH,9 MOV AH,9 MOV DX,OFFSET VAR MOV DX,OFFSET VAR INT 21H INT 21H ENDM ENDM模块化程序设计模块化程序设计DATA SEGMENT USE16DATA SEGMENT USE16N EQU 28 DUP( )N EQU 28 DUP( )L1 DB N, MENU ,0DH,0AHL1 DB N, MENU ,0DH,0AH DB N, ,0DH,0AH DB N, ,0DH

51、,0AH DB N, 1. BEIJING ,0DH,0AH DB N, 1. BEIJING ,0DH,0AH DB N, 2. NANJING ,0DH,0AH DB N, 2. NANJING ,0DH,0AH DB N, 3. RETURN DOS ,0DH,0AH DB N, 3. RETURN DOS ,0DH,0AH DB N, ,0DH,0AH DB N, ,0DH,0AHL7 DB N, CHOICE(1,2,3):$ L7 DB N, CHOICE(1,2,3):$ MESG1 DB WELCOME TO BEIJING ! $ MESG1 DB WELCOME TO BE

52、IJING ! $ MESG2 DB WELCOME TO NANJING ! $ MESG2 DB WELCOME TO NANJING ! $ ENDMESG DB please strike any key $ ENDMESG DB please strike any key $ DATA ENDSDATA ENDSCODE SEGMENT CODE SEGMENT BYTE PUBLIC BYTE PUBLIC CODEUSE16CODEUSE16 ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATABEG: MOV AX,DATABEG: MOV

53、 AX,DATA MOV DS,AX MOV DS,AX MOV AX,2 MOV AX,2 INT 10H INT 10H DISP 0500H,L1 DISP 0500H,L1AGA: DISP 0B00H,L7AGA: DISP 0B00H,L7 MOV AH,1 MOV AH,1 INT 21H INT 21H CMP AL,3 CMP AL,3 JE EXIT JE EXIT CMP AL,1 CMP AL,1 JE BEG1 JE BEG1 CMP AL,2CMP AL,2 JE BEG2 JE BEG2 JMP AGA JMP AGAEXIT: MOV AH,4CHEXIT: M

54、OV AH,4CH INT 21H INT 21HCODE ENDSCODE ENDS END BEG END BEG ;FILENAME:6132_1.ASM;FILENAME:6132_1.ASM .486 .486 PUBLIC BEG1PUBLIC BEG1 EXTRN MESG1:BYTE,NEXT:NEAR EXTRN MESG1:BYTE,NEXT:NEARDISP MACRO YYXX,VARDISP MACRO YYXX,VAR MOV AH,2 MOV AH,2 MOV BH,0 MOV BH,0 MOV DX,YYXX MOV DX,YYXX INT 10H INT 10

55、H MOV AH,9 MOV AH,9 MOV DX,OFFSET VAR MOV DX,OFFSET VAR INT 21H INT 21H ENDM ENDMCODE SEGMENT BYTE PUBLIC CODEUSE16CODE SEGMENT BYTE PUBLIC CODEUSE16 ASSUME CS:CODE ASSUME CS:CODEBEG1: MOV AX,2BEG1: MOV AX,2 INT 10H INT 10H DISP 0C1EH,MESG1 DISP 0C1EH,MESG1 JMP NEXT JMP NEXTCODE ENDSCODE ENDS END EN

56、D ;FILENAME:6132_2.ASM;FILENAME:6132_2.ASM .486 .486 PUBLIC BEG2,NEXTPUBLIC BEG2,NEXT EXTRN EXTRN MESG2:BYTE,ENDMESG:BYTE,BEG:NEARMESG2:BYTE,ENDMESG:BYTE,BEG:NEARDISP MACRO YYXX,VARDISP MACRO YYXX,VAR MOV AH,2 MOV AH,2 MOV BH,0 MOV BH,0 MOV DX,YYXX MOV DX,YYXX INT 10H INT 10H MOV AH,9 MOV AH,9 MOV D

57、X,OFFSET VAR MOV DX,OFFSET VAR INT 21H INT 21H ENDM ENDMCODE SEGMENT BYTE PUBLIC CODE USE16CODE SEGMENT BYTE PUBLIC CODE USE16 ASSUME CS:CODE ASSUME CS:CODEBEG2: MOV AX,2BEG2: MOV AX,2 INT 10H INT 10H DISP 0C1EH,MESG2 DISP 0C1EH,MESG2NEXT:NEXT: DISP 171DH,ENDMESG DISP 171DH,ENDMESG MOV AH,1 MOV AH,1

58、 INT 21H INT 21H JMP BEG JMP BEGCODE ENDSCODE ENDS END END解法解法1 1,2 2中,每一个模块中都定义了一条宏指令中,每一个模块中都定义了一条宏指令DISP,DISP,该指令完成该指令完成光标定位与字符串显示光标定位与字符串显示, ,宏指令的名称、结构和参数都相同。宏指令的名称、结构和参数都相同。 解法解法3 3设计思路与程序分析设计思路与程序分析 定义一次宏指令定义一次宏指令DISP,DISP,各模块共享各模块共享. . 把要共享的宏指令单独组织一个文件把要共享的宏指令单独组织一个文件( (注意:只编辑不汇编注意:只编辑不汇编),),

59、存存放在指定的目录下放在指定的目录下, ,然后在调用模块中用然后在调用模块中用INCLUDEINCLUDE伪指令说明即可伪指令说明即可。 本例将本例将DISPDISP宏指令单独组织一个文件,文件名为宏指令单独组织一个文件,文件名为”DISPLAY.MAC”,DISPLAY.MAC”,该文件和主模块文件以及两个子模块文件都放该文件和主模块文件以及两个子模块文件都放在同一个目录下,因此,在同一个目录下,因此,INCLUDEINCLUDE伪指令可以不必写出该文件的盘伪指令可以不必写出该文件的盘符和路径。符和路径。以解法以解法2 2为基础运用宏指令共享技术为基础运用宏指令共享技术, ,该程序由该程序由

60、4 4个源文件组成。个源文件组成。模块化程序设计模块化程序设计 解法解法3 3程序清单程序清单 ; ;FILENAME:DISPLAY.MACFILENAME:DISPLAY.MACDISP MACRO YYXX,VARDISP MACRO YYXX,VAR MOV AH,2 MOV AH,2 MOV BH,0 MOV BH,0 MOV DX,YYXX MOV DX,YYXX INT 10H INT 10H MOV AH,9 MOV AH,9 MOV DX,OFFSET VAR MOV DX,OFFSET VAR INT 21H INT 21H ENDM ENDM模块化程序设计模块化程序设计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论