模块化程序设计与混合编程培训课件

上传人:日度 文档编号:149732097 上传时间:2020-10-29 格式:PPT 页数:80 大小:664.50KB
返回 下载 相关 举报
模块化程序设计与混合编程培训课件_第1页
第1页 / 共80页
模块化程序设计与混合编程培训课件_第2页
第2页 / 共80页
模块化程序设计与混合编程培训课件_第3页
第3页 / 共80页
模块化程序设计与混合编程培训课件_第4页
第4页 / 共80页
模块化程序设计与混合编程培训课件_第5页
第5页 / 共80页
点击查看更多>>
资源描述

《模块化程序设计与混合编程培训课件》由会员分享,可在线阅读,更多相关《模块化程序设计与混合编程培训课件(80页珍藏版)》请在金锄头文库上搜索。

1、高等教育出版社,王成端 主编,2008.6,汇编语言程序设计(第2版),普通高等教育“十一五”国家级规划教材,2,第9章 模块化程序设计与混合编程,模块化技术是大型软件开发的基本技术,高、低级语言间的混合编程是大型软件常用的另一技术。本章详述这两种技术,应重点掌握二个汇编语言模块间的代码调用与数据交换方法,以及编写能够被C语言调用的汇编语言模块的方法。,9.1 模块化程序设计 9.2 汇编语言与高级语言的接口 实训一 键盘录入数据的转换与显示 实训二 C语言调用汇编语言子程序进行数据传递与显示,3,9.1 模块化的程序设计,9.1.1 模块化设计原则 9.1.2 模块之间组合与通信 9.1.3

2、 模块化设计举例,第9章 模块化程序设计与混合编程,4,对于一个大而复杂的任务,我们一般把整个程序分成若干个子任务或模块,称为“模块化程序设计”。模块化设计的难题是:如何把程序分成模块,以及如何再装配起来。,1. 模块化的优点,单个的模块易于编写、调试、修改。 一个模块可以在多个地方或多个程序中使用。 可以直接利用已有的模块。 多个程序员可以并行工作。,9.1.1 模块化设计原则,第9章 模块化程序设计与混合编程,5,2. 模块化的缺点,增加了模块的划分工作。 模块的装配也是难题,尤其是合并多人编写的程序时。 为调试一个模块,需要额外地为其准备调试数据、专用程序等,模块化程序设计的关键是模块的

3、划分,层次图和模块说明是模块划分的主要描述工具。层次图是一个方块图,用来表示模块与模块之间的调用关系,如图9-1所示。模块说明是模块功能的文字描述,应简要写出模块的功能、所用基本算法、入口参数、出口参数、所调用到的其它模块、调用注意事项等信息。,3. 模块的描述,第9章 模块化程序设计与混合编程,6,图9-1 层次图,第9章 模块化程序设计与混合编程,7,4. 模块的划分原则,模块的划分无固定的规则,应视情况灵活确定,但应遵循如下基本原则: 模块间的调用关系尽可能简单。尽量避免从多个入口点进入模块或从多个出口点退出,否则模块不易调试。 模块间的数据耦合应尽量小,即尽量减少数据传递,对于需要传递

4、参数个数较多的模块,可考虑合并成一个模块。 模块的大小适中,若一个模块太大,则编写调试因难;若太小,模块间的调用、连接开销则太大,一般一个模块长度在50至500行内为宜。,返回本章首页,返回本节首页,第9章 模块化程序设计与混合编程,8,9.1.2模块之间的组合与通讯,一个大程序划分为若干模块后,各个模块分别编写并汇编成目标模块文件(.OBJ文件),然后由链接程序(如LINK.EXE或TLINK.EXE等)将各个模块组合在一起,成为一个可执行文件(.EXE文件)。模块间的组合,主要由链接程序完成。一个模块中往往有多个段,多个模块则有更多的段,这些段在链接时有的需要合并成一个,有的则需要相互重叠

5、,有的则不与其它段发生联系。要想使链接程序按预想的方案组合各个段,关键是在各个模块编写前约定好段名、组合类型、定位类型、类别等参数,其中组合类型指定各个模块间的同名段该如何处理(各自独立?相互合并?相互重叠?),而定位类型决定段的地址要求,它关系到段间是否留有空隙的问题,类别则会导至调整段的先后次序。其中主要的参数是组合类型。,返回本章首页,返回本节首页,第9章 模块化程序设计与混合编程,9,由于各个模块被单独汇编,所以A模块要想调用B模块内定义的符号(变量、过程等),那么A模块必须通知汇编程序指定的符号在别的模块内,否则汇编时会出错。另外,B模块内也必须通知汇编程序某个符号将被其它模块调用,

6、否则汇编程序不会把它写入目标文件中,最后导致链接失败。,第9章 模块化程序设计与混合编程,10,9.1.3 模块化设计举例,1. 模块间代码的转移 一个模块调用另一个模块的代码时,若调用者所在的段与位于另一模块内的被调用者所在的段链接后能合并成一个段,则调用相当于段内调用,转移采用近转移即可;若不能合并成一个段,则必须采用远转移。,第9章 模块化程序设计与混合编程,11,【例9.1】某系统由A、B二个模块构成,A模块要调用到B模块的一个过程disp,以显示一个字符。二个模块如下:,模块A:,EXTRNDISP:NEAR.MODELSMALL.CODESTART:CALLDISPMOVAH,4C

7、HINT21HENDSTART,第9章 模块化程序设计与混合编程,12,模块B:,PUBLICDISP.MODELSMALL.CODEDISPPROCNEARMOVDL,AMOVAH,2INT21HRETDISPENDPEND,第9章 模块化程序设计与混合编程,13,假设模块A存盘后文件名为A.ASM,模块B存盘后文件名为B.ASM,则可用以下命令行分别汇编,然后链接合并。MASM A;MASM B;LINK A+B; 最后得到可执行文件A.EXE。执行该文件,可在屏幕上显示字符A。 在这个例子中,两个模块存储模式相同,并且都是用.CODE伪指令指定代码段,则二个模块内代码段的段名、定位类型、

8、组合类型、类别等都由汇编程序自动生成(分别为:TEXT、WORD、PUBLIC、CODE),由于二个段是同名段,且都为PUBLIC组合类型,故链接程序最后将其合并为一个段,因而模块A对模块B内disp的调用为段内调用。,第9章 模块化程序设计与混合编程,14,【例9.2】段间调用。对例9-1中的二个模块作如下修改:,EXTRNDISP:FAR.MODELSMALL.CODESTART: CALLDISP MOVAH,4CH INT21H ENDSTART,模块A:,模块B:,PUBLICDISPCODESEGMENTASSUMECS:CODEDISPPROCFARMOVDL,AMOVAH,2I

9、NT21HRETDISPENDPEND,第9章 模块化程序设计与混合编程,15,在这个例子中,由于模块B中代码段的段名与模块A中的不再一致,故二个段是各自独立的代码段,调用成为段间调用,disp不论在模块A中的外部符号声明还是在模块B中的类型定义,都必须为FAR类型。,第9章 模块化程序设计与混合编程,16,2. 模块间数据的访问 两个模块之间若要相互交换数据,可用如下几种办法实现: a 通过寄存器传递 b 通过堆栈传递 c 互访对方变量或数据区 a、b二种方法较为简单,因为不论在同一模块内的各个过程间,还是在不同模块内的各个过程间,都中在共用相同的CPU寄存器和堆栈段,所以这种况下调用在模块

10、内还是在模块外情况并无差别。下面主要讨论模块间互访对方变量或数据区的方法。,第9章 模块化程序设计与混合编程,17,3. 模块间互访对方变量或数据区的方法 一个模块要访问另一个模块内的数据,关键是调整数据段寄存器使之存储被访问数据所在段的段地址。,【例9.3】演示一个模块内访问另一模块内变量或数据区的方法。 某工程由如下二个模块组成。,第9章 模块化程序设计与混合编程,18,模块A:,EXTRNSET:FARPUBLICBUF1.MODELSMALL.DATABUF1DB3.CODESTART:MOVAX,DATAMOVDS,AXCALLSETMOVDL,BUF1MOVAH,2INT21HMO

11、VAH,4CHINT21HENDSTART,第9章 模块化程序设计与混合编程,19,模块B:,EXTRNBUF1:BYTEPUBLICSETCODESEGMENTASSUME CS:CODESETPROCFARMOVBUF1,8RETSETENDPCODEENDSEND,在这个例子中,当控制从模块A转到模块B后,DS寄存器仍指向模块A的数据段,所以模块B中可用DS直接访问模块A中的数据,这种情况相当于在一个模块中有二个代码段一个数据段的情况,不论控制在哪个代码段内,都可直接访问数据段。,第9章 模块化程序设计与混合编程,20,【例9.4】二个模块都有自己的数据段时从一个模块访问另一个模块数据区

12、的方法。对例9.3进行修改如下:,EXTRNSET:FARPUBLICBUF1.MODELSMALL.DATABUF1DB3.CODESTART:MOVAX,DATAMOVDS,AXCALLSETMOVDL,BUF1MOVAH,2INT21HMOVAH,4CHINT21HENDSTART,模块A:,第9章 模块化程序设计与混合编程,21,模块B:,EXTRNBUF1:BYTEPUBLICSETDATASEGMENTBUF2DB5DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASETPROCFARPUSHDSMOVAX,DATAMOVDS,AXMOVBL,BUF

13、2MOVAX,SEG BUF1MOVDS,AXMOVAL,BUF1ADDAL,BLMOVBUF1,ALPOPDSRETSETENDPCODEENDSEND,运行显示: 8,第9章 模块化程序设计与混合编程,22,这个例子中模块A与模块B各有自已的数据段,当控制从模块A转移到模块B时,DS仍指向模块A的数据段,由于模块B要使用DS访问自已的数据段,所以它先将DS压栈保存,然后使DS指向自己的数据段,完成数据的读取后,又修改DS使之指向模块A的数据段,从而访问模块A的BUF1变量 。最后,在返回模块A前通过出栈将DS恢复为进入时的初值(本例中由于在访问模块A的变量BUF1时已使DS指向了模块A的数

14、据段,保存恢复DS的工作可以省略)。,这个例子的关键是访问外部模块的变量前事先要调整DS使之保存外部变量所在段的段地址。由于访问内存并不一定非要用DS,若用其它段寄存器(如ES),则除了要事先调整该段寄存器使之存储被访问外部变量所在段的段值外,还要在使用变量时在前面加上段超越标记,如可将模块B修改如下:,第9章 模块化程序设计与混合编程,23,EXTRNBUF1:BYTEPUBLICSETDATASEGMENTBUF2DB5DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASETPROCFARPUSHDSMOVAX,DATAMOVDS,AXMOVBL,BUF2M

15、OVAX,SEG BUF1MOVES,AXMOVAL,ES:BUF1;使用段超越标记ADDAL,BLMOVES:BUF1,ALPOPDSRETSETENDPCODEENDSEND,第9章 模块化程序设计与混合编程,24,模块间信息传递的另一个方法是利用COMMON段,只要二个模块中都定义一个同名同类别的数据段,且组合类型都为COMMON,由于这二个段在链接时要重合为一个段,只要在这二个段内将变量安排在相同的位置上,那么它们对应的是相同的存储区。,【例9.5】利用COMMON段访问另一个模块的数据区。将上例进行修改,如下:,第9章 模块化程序设计与混合编程,25,模块A:,EXTRNSET:FA

16、RDATASEGMENTCOMMONBUF1DB3BUF2DB0DATAENDSCODE1 SEGMENTASSUMECS:CODE1,DS:DATASTART:MOVAX,DATAMOVDS,AXCALLSETMOVDL,BUF2MOVAH,2INT21HMOVAH,4CHINT21HCODE1ENDSENDSTART,第9章 模块化程序设计与混合编程,26,模块B:,PUBLICSETDATASEGMENTBUF1DB?BUF2DB?DATAENDSCODE2 SEGMENTASSUMECS:CODE2,DS:DATASETPROCFARMOVAL,BUF1ADDBUF2,ALRETSETENDPCODE2ENDSEND,返回本章首页,返回本节首页,第9章 模块化程序设计与混合编程,27,9.2 汇编语言与高级语言的接口,9.2.1 概述 9.2.2 嵌入式汇编 9.2.3 汇编语言与C语言的接口,第9章 模块化程序设计与混合编程,28,9.2.1概述,对于一项软件工程而言,首要目标是保证达到软件所需质量,其次是尽可能降低开发成本。汇编语言与高级语言在语言表达能力、表达的方便程度、

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

最新文档


当前位置:首页 > 高等教育 > 专业基础教材

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