模块化程序设计与混合编程.ppt
《模块化程序设计与混合编程.ppt》由会员分享,可在线阅读,更多相关《模块化程序设计与混合编程.ppt(80页珍藏版)》请在三一办公上搜索。
1、高等教育出版社,王成端 主编,2008.6,汇编语言程序设计(第2版),普通高等教育“十一五”国家级规划教材,第9章 模块化程序设计与混合编程,模块化技术是大型软件开发的基本技术,高、低级语言间的混合编程是大型软件常用的另一技术。本章详述这两种技术,应重点掌握二个汇编语言模块间的代码调用与数据交换方法,以及编写能够被C语言调用的汇编语言模块的方法。,9.1 模块化程序设计 9.2 汇编语言与高级语言的接口实训一 键盘录入数据的转换与显示实训二 C语言调用汇编语言子程序进行数据传递与显示,9.1 模块化的程序设计,9.1.1 模块化设计原则9.1.2 模块之间组合与通信9.1.3 模块化设计举例
2、,第9章 模块化程序设计与混合编程,对于一个大而复杂的任务,我们一般把整个程序分成若干个子任务或模块,称为“模块化程序设计”。模块化设计的难题是:如何把程序分成模块,以及如何再装配起来。,1.模块化的优点,单个的模块易于编写、调试、修改。一个模块可以在多个地方或多个程序中使用。可以直接利用已有的模块。多个程序员可以并行工作。,9.1.1 模块化设计原则,第9章 模块化程序设计与混合编程,2.模块化的缺点,增加了模块的划分工作。模块的装配也是难题,尤其是合并多人编写的程序时。为调试一个模块,需要额外地为其准备调试数据、专用程序等,模块化程序设计的关键是模块的划分,层次图和模块说明是模块划分的主要
3、描述工具。层次图是一个方块图,用来表示模块与模块之间的调用关系,如图9-1所示。模块说明是模块功能的文字描述,应简要写出模块的功能、所用基本算法、入口参数、出口参数、所调用到的其它模块、调用注意事项等信息。,3.模块的描述,第9章 模块化程序设计与混合编程,图9-1 层次图,第9章 模块化程序设计与混合编程,4.模块的划分原则,模块的划分无固定的规则,应视情况灵活确定,但应遵循如下基本原则:模块间的调用关系尽可能简单。尽量避免从多个入口点进入模块或从多个出口点退出,否则模块不易调试。模块间的数据耦合应尽量小,即尽量减少数据传递,对于需要传递参数个数较多的模块,可考虑合并成一个模块。模块的大小适
4、中,若一个模块太大,则编写调试因难;若太小,模块间的调用、连接开销则太大,一般一个模块长度在50至500行内为宜。,返回本章首页,返回本节首页,第9章 模块化程序设计与混合编程,模块之间的组合与通讯,一个大程序划分为若干模块后,各个模块分别编写并汇编成目标模块文件(.OBJ文件),然后由链接程序(如LINK.EXE或TLINK.EXE等)将各个模块组合在一起,成为一个可执行文件(.EXE文件)。模块间的组合,主要由链接程序完成。一个模块中往往有多个段,多个模块则有更多的段,这些段在链接时有的需要合并成一个,有的则需要相互重叠,有的则不与其它段发生联系。要想使链接程序按预想的方案组合各个段,关键
5、是在各个模块编写前约定好段名、组合类型、定位类型、类别等参数,其中组合类型指定各个模块间的同名段该如何处理(各自独立?相互合并?相互重叠?),而定位类型决定段的地址要求,它关系到段间是否留有空隙的问题,类别则会导至调整段的先后次序。其中主要的参数是组合类型。,返回本章首页,返回本节首页,第9章 模块化程序设计与混合编程,由于各个模块被单独汇编,所以A模块要想调用B模块内定义的符号(变量、过程等),那么A模块必须通知汇编程序指定的符号在别的模块内,否则汇编时会出错。另外,B模块内也必须通知汇编程序某个符号将被其它模块调用,否则汇编程序不会把它写入目标文件中,最后导致链接失败。,第9章 模块化程序
6、设计与混合编程,9.1.3 模块化设计举例,1.模块间代码的转移 一个模块调用另一个模块的代码时,若调用者所在的段与位于另一模块内的被调用者所在的段链接后能合并成一个段,则调用相当于段内调用,转移采用近转移即可;若不能合并成一个段,则必须采用远转移。,第9章 模块化程序设计与混合编程,【例9.1】某系统由A、B二个模块构成,A模块要调用到B模块的一个过程disp,以显示一个字符。二个模块如下:,模块A:,EXTRNDISP:NEAR.MODELSMALL.CODESTART:CALLDISPMOVAH,4CHINT21HENDSTART,第9章 模块化程序设计与混合编程,模块B:,PUBLIC
7、DISP.MODELSMALL.CODEDISPPROCNEARMOVDL,AMOVAH,2INT21HRETDISPENDPEND,第9章 模块化程序设计与混合编程,假设模块A存盘后文件名为A.ASM,模块B存盘后文件名为B.ASM,则可用以下命令行分别汇编,然后链接合并。MASM A;MASM B;LINK A+B;最后得到可执行文件A.EXE。执行该文件,可在屏幕上显示字符A。在这个例子中,两个模块存储模式相同,并且都是用.CODE伪指令指定代码段,则二个模块内代码段的段名、定位类型、组合类型、类别等都由汇编程序自动生成(分别为:TEXT、WORD、PUBLIC、CODE),由于二个段是
8、同名段,且都为PUBLIC组合类型,故链接程序最后将其合并为一个段,因而模块A对模块B内disp的调用为段内调用。,第9章 模块化程序设计与混合编程,【例9.2】段间调用。对例9-1中的二个模块作如下修改:,EXTRNDISP:FAR.MODELSMALL.CODESTART:CALLDISPMOVAH,4CHINT21HENDSTART,模块A:,模块B:,PUBLICDISPCODESEGMENTASSUMECS:CODEDISPPROCFARMOVDL,AMOVAH,2INT21HRETDISPENDPEND,第9章 模块化程序设计与混合编程,在这个例子中,由于模块B中代码段的段名与模块
9、A中的不再一致,故二个段是各自独立的代码段,调用成为段间调用,disp不论在模块A中的外部符号声明还是在模块B中的类型定义,都必须为FAR类型。,第9章 模块化程序设计与混合编程,2.模块间数据的访问 两个模块之间若要相互交换数据,可用如下几种办法实现:a 通过寄存器传递 b 通过堆栈传递 c 互访对方变量或数据区 a、b二种方法较为简单,因为不论在同一模块内的各个过程间,还是在不同模块内的各个过程间,都中在共用相同的CPU寄存器和堆栈段,所以这种况下调用在模块内还是在模块外情况并无差别。下面主要讨论模块间互访对方变量或数据区的方法。,第9章 模块化程序设计与混合编程,3.模块间互访对方变量或
10、数据区的方法 一个模块要访问另一个模块内的数据,关键是调整数据段寄存器使之存储被访问数据所在段的段地址。,【例9.3】演示一个模块内访问另一模块内变量或数据区的方法。某工程由如下二个模块组成。,第9章 模块化程序设计与混合编程,模块A:,EXTRNSET:FARPUBLICBUF1.MODELSMALL.DATABUF1DB3.CODESTART:MOVAX,DATAMOVDS,AXCALLSETMOVDL,BUF1MOVAH,2INT21HMOVAH,4CHINT21HENDSTART,第9章 模块化程序设计与混合编程,模块B:,EXTRNBUF1:BYTEPUBLICSETCODESEGM
11、ENTASSUME CS:CODESETPROCFARMOVBUF1,8RETSETENDPCODEENDSEND,在这个例子中,当控制从模块A转到模块B后,DS寄存器仍指向模块A的数据段,所以模块B中可用DS直接访问模块A中的数据,这种情况相当于在一个模块中有二个代码段一个数据段的情况,不论控制在哪个代码段内,都可直接访问数据段。,第9章 模块化程序设计与混合编程,【例9.4】二个模块都有自己的数据段时从一个模块访问另一个模块数据区的方法。对例9.3进行修改如下:,EXTRNSET:FARPUBLICBUF1.MODELSMALL.DATABUF1DB3.CODESTART:MOVAX,DA
12、TAMOVDS,AXCALLSETMOVDL,BUF1MOVAH,2INT21HMOVAH,4CHINT21HENDSTART,模块A:,第9章 模块化程序设计与混合编程,模块B:,EXTRNBUF1:BYTEPUBLICSETDATASEGMENTBUF2DB5DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASETPROCFARPUSHDSMOVAX,DATAMOVDS,AXMOVBL,BUF2MOVAX,SEG BUF1MOVDS,AXMOVAL,BUF1ADDAL,BLMOVBUF1,ALPOPDSRETSETENDPCODEENDSEND,运行显示:8
13、,第9章 模块化程序设计与混合编程,这个例子中模块A与模块B各有自已的数据段,当控制从模块A转移到模块B时,DS仍指向模块A的数据段,由于模块B要使用DS访问自已的数据段,所以它先将DS压栈保存,然后使DS指向自己的数据段,完成数据的读取后,又修改DS使之指向模块A的数据段,从而访问模块A的BUF1变量。最后,在返回模块A前通过出栈将DS恢复为进入时的初值(本例中由于在访问模块A的变量BUF1时已使DS指向了模块A的数据段,保存恢复DS的工作可以省略)。,这个例子的关键是访问外部模块的变量前事先要调整DS使之保存外部变量所在段的段地址。由于访问内存并不一定非要用DS,若用其它段寄存器(如ES)
14、,则除了要事先调整该段寄存器使之存储被访问外部变量所在段的段值外,还要在使用变量时在前面加上段超越标记,如可将模块B修改如下:,第9章 模块化程序设计与混合编程,EXTRNBUF1:BYTEPUBLICSETDATASEGMENTBUF2DB5DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASETPROCFARPUSHDSMOVAX,DATAMOVDS,AXMOVBL,BUF2MOVAX,SEG BUF1MOVES,AXMOVAL,ES:BUF1;使用段超越标记ADDAL,BLMOVES:BUF1,ALPOPDSRETSETENDPCODEENDSEND,第9
15、章 模块化程序设计与混合编程,模块间信息传递的另一个方法是利用COMMON段,只要二个模块中都定义一个同名同类别的数据段,且组合类型都为COMMON,由于这二个段在链接时要重合为一个段,只要在这二个段内将变量安排在相同的位置上,那么它们对应的是相同的存储区。,【例9.5】利用COMMON段访问另一个模块的数据区。将上例进行修改,如下:,第9章 模块化程序设计与混合编程,模块A:,EXTRNSET:FARDATASEGMENTCOMMONBUF1DB3BUF2DB0DATAENDSCODE1 SEGMENTASSUMECS:CODE1,DS:DATASTART:MOVAX,DATAMOVDS,A
16、XCALLSETMOVDL,BUF2MOVAH,2INT21HMOVAH,4CHINT21HCODE1ENDSENDSTART,第9章 模块化程序设计与混合编程,模块B:,PUBLICSETDATASEGMENTBUF1DB?BUF2DB?DATAENDSCODE2 SEGMENTASSUMECS:CODE2,DS:DATASETPROCFARMOVAL,BUF1ADDBUF2,ALRETSETENDPCODE2ENDSEND,返回本章首页,返回本节首页,第9章 模块化程序设计与混合编程,9.2 汇编语言与高级语言的接口,9.2.1 概述9.2.2 嵌入式汇编9.2.3 汇编语言与C语言的接口
17、,第9章 模块化程序设计与混合编程,概述,对于一项软件工程而言,首要目标是保证达到软件所需质量,其次是尽可能降低开发成本。汇编语言与高级语言在语言表达能力、表达的方便程度、编程效率和运行效率方面各有特点,这就需要它们相互“取长补短”,即混合编程,以便取得最大的综合效益。高级语言与汇编语言的混合编程通常发生在下列情况下:需要访问机器的硬件特征,这些特征用高级语言表达比较困难。某些程序段需要频烦运行,单次运行速度的提高可显著提高整个系统运行效率。有现成的汇编语言程序段可用。,第9章 模块化程序设计与混合编程,高级语言种类较多,本章主要讨论与C语言的混合编程问题,流行的C编译器主要有Turbo C和
18、MS C,本书主要以Turbo C为例。C语言的目标是追求效率,因而它与汇编语言与较多的“血源关系”。C语言提供了三种调用汇编语言功能的方法:(1)嵌入汇编(2)寄存器伪变量与bdos()、intdos()、int86()等系列DOS、BIOS服务调用函数(3)C语言与汇编语言的混合编程。其中第二种方法因主要涉及C语言的编程问题,本书不作讨论,请读者参考相关C语言书籍。,返回本章首页,返回上一节,返回本节首页,第9章 模块化程序设计与混合编程,嵌入式汇编 在C程序中可以直接插入汇编语言语句,称为嵌入式汇编。,1.嵌入式汇编语句的格式,asm,说明:,asm 是嵌入汇编语句的关键字,可是任何有效
19、的汇编指令或伪指令,是可选的。,是汇编指令或伪指令的操作数,它可引用C语言中的常量、变量和标号。,都表示asm语句的结束,一行内可写多条嵌入式汇编语句,它们以“;”分隔。一行内如果只有一个asm语句,则后面不需要“;”,asm 语句是C语言中唯一的依靠换行的语句。,asm语句如需要注释,必须采用C格式的注释,即“/*注释内容*/”,编译后,函数外的汇编语句放在数据段内,函数内的汇编语句放在代码段内。,第9章 模块化程序设计与混合编程,2.嵌入式汇编的编译连接,含有嵌入式汇编的程序不能在Turbo C集成开发环境下进行编译,因为集成开发环境不支持这一功能。这样的程序必须使用Turbo C的命令行
20、编译器TCC.EXE进行编译,而TCC.EXE在编译是又要调用TASM.EXE,所以当前目录下必须保证有汇编程序TASM.EXE。,TCC.EXE调用格式为:,其中files需要编译或连接的文件,可有一个或多个。options 为各个参数选项,常用的有“-B”用于指示源程序中使用了嵌入汇编,“S”能使TCC.EXE编译成汇编语言的源程序输出。若程序中使用了嵌入汇编,调用TCC时必须选择-B参数,或者是在程序中使用伪指令“#pragma inline”,此伪指令功能与“-B”参数等效。,TCC options files,第9章 模块化程序设计与混合编程,【例9.6】嵌入式汇编的编译连接有如下程
21、序:asm BUF DB“this is a test$”main()asmMOVAH,9asmMOVDX,OFFSETBUFasmINT21H 在TC的集成开发环境下编辑完以上程序后,存盘(假设文件名为 test.c),然后以如下命令行进行编译连接:tcc B test.c.(注意:tcc的参数是区分大小写的,不要将“-B”写成“-b”)则可生成test.exe文件,在DOS下运行之,即可在屏幕上显示“this is a test”。,第9章 模块化程序设计与混合编程,【例9.7】从嵌入汇编语句中访问C定义的局部及全局变量。分析如下程序:,#includeinti=3;main()charj
22、=a;structsintx;inty;stru;stru.x=50;stru.y=20;printf(nj=%c,j);asmincbyteptrjprintf(nj=%c,j);printf(ni=%d,i);asmmovax,stru.xasmsubax,stru.yasmmovi,axprintf(ni=%d,i);,该程序的运行结果如下:,第9章 模块化程序设计与混合编程,3.嵌入汇编的限制,嵌入汇编码中的转移指令只能引用C中定义的标号,而嵌入汇编码中的非转移指令则可引用除标号以外的任何C元素。在嵌入汇编码的末尾,下列寄存器的值必须与进入嵌入汇编码时的值保持一致:BP、SP、CS、D
23、S、SS。如果C程序中用到了寄存器变量,还需再保证SI、DI的值不变,其它寄存器的值可自由改变。,返回本章首页,返回本节首页,第9章 模块化程序设计与混合编程,9.2.3 汇编语言与语言的混合编程,1.调用约定,在混合编程中,双方在如下方面必须遵循相同的接口约定,才可使双方的代码协同工作。,内存模式:,即对内存的使用,主要是段、组的划分,以及段名、组名的约定等。若二种语言对段的划分情况不同,则双方指针或地址的使用便不同,这时极易发生运行错误。如在函数调用中,一方将四节地址压栈,而另一方则只将二字节地址出栈,可能造成程序崩溃。,命名约定:,即标识符的命名规则,以及是否区分大小写等。,调用约定:,
24、调用者以什么顺序将参数压栈,被调用者以什么顺序提取参数,由谁负责最后清除堆栈中的参数等。,参数传递约定:,调用参数以什么方式传递的,例如传递的是参数的值还是参数的地址等。,第9章 模块化程序设计与混合编程,2.Tucbo C的六种存储模式 为允许程序员决定内存布局结构,以便更合理高效地使用内存,Tucbo C提供了六种存储模式(MS C相同),如下:,极小模式:,程序的所有代码和数据限制在64K内,即程序只有一个段,CS=DS=ES=SS,所有指针全部为near指针。,小模式:,代码和数据各占一个段,因而代码和数据分别不能超过64K。DS=SS=ES,所有指针都为near指针。,中模式:,代码
25、段用far指针,数据段用near指针,代码段可多达1M,数据不能超过64K。,紧凑模式:,数据段用far指针,代码段用near指针。代码最多64K,数据可多达1M。,大模式:,代码、数据均用far指针,因而均可多达1M。,极大模式:,代码、数据均用far指针。Turbo C一般限制静态数据为64K,极大模式下可打破此限制。,第9章 模块化程序设计与混合编程,3.Turbo C的调用约定 为了解Turbo C的调用接口机制,观察其以汇编形式给出的编译结果是最好的方式。假设有如下C程序:,#includeintpara1=10;intpara2;intadd(inta,intb)return(a+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模块化 程序设计 混合 编程
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6439036.html