第9章 多模块程序设计与混合编程
1.教学目的:掌握汇编语言多模块程序设计和汇编语言与高级语言之间混合编程的基本概念、技术和方法。
2.教学要求:
①理解多模块程序设计的基本概念
②掌握汇编语言程序的多模块连接
③了解多模块之间段的连接与模块间的交叉访问
④理解汇编语言与高级程序的连接的原理。
⑤掌握汇编语言与C语言的接口的实现方法
⑥掌握汇编语言与Pascal语言的接口的实现方法
3.教学重点:
①汇编语言与C语言的接口的实现
②汇编语言与Pascal语言的接口的实现
4.掌握难点:
①连接的原理
5.教学进程安排:P247~285
6.教学方法:
课堂讲授
7.教学内容摘要:
9.1 多模块程序设计的基本概念
1.一个复杂程序可以分成若干个模块,可由不同人员分头完成;
2.每个模块的任务明确,便于理解;
3.单个模块易于编写和调试;
4.便于程序的维护和修改;
5.可以直接利用已有的模块。
9.2 汇编语言程序的多模块连接
9.2.1 多模块之间段的连接
⒈ SEGMENT语句提供的连接信息段名 SEGMENT [定位类型] [组合类型] [’类别’]

段名 ENDS
(1)组合类型
(2)‘类别’
2,GROUP伪指令段组名 GROUP 段名〔,段名,···〕
(1)段组名
(2)段名
9.2.2 模块间的交叉访问
1,伪指令PUBLIC和EXTRN
(1)伪指令PUBLIC
PUBLIC 标识符,标识符,…
(2)伪指令EXTRN
EXTRN 标识符:类型,标识符:类型,…
2.模块间交叉访问时的编程考虑
3.建立完整的可执行文件
(1)将各源程序模块分别汇编,并建立各自的目标模块(即建立各自的*.OBJ文件)。
(2)用连接程序LINK将这些目标模块连接成一个可执行文件。
(3)多个模块连接成一个可执行文件后,该文件只有一个启动地址,所以,连接成一个完整程序的各个源模块中只能有一个源模块中的结束伪指令END可以带表达式,以指出整个程序的启动地址。
【例9-5】多模块程序设计,利用多模块实现两个32位数的相乘。
9.3 汇编语言与高级语言程序的连接
汇编语言和高级语言混合编程,需要解决两个主要的技术问题:
1.是不同语言程序模块之间的连接,
2.是调用过程中参数的传递方法。
9.3.1 调用协议
1,入口参数传递规则
(1)C语言调用协议
(2)Pascal语言调用协议
2,返回值传递规则
(1)如果返回值为单字节数则放入AL;
(2)如果返回值为单字则放入AX;
(3)如果返回值为双字则放入DX:AX,其中DX中存放高字,AX中存放低字;
(4)如果返回值大小超过双字则存放在系统静态变量存储区中,指向这个静态变量存储区的指针值在AX(近指针)或者DX:AX(远指针)内。
(5)在子程序完成预先定义的功能返回主程序时,C语言调用协议是由主程序来完成参数出栈,而Pascal语言调用协议却是由子程序来完成参数出栈工作的。
3,寄存器保护规则寄存器保护规则把CPU内部寄存器分为如下4类:
(1)CS,IP,SS,SP,FLAGS:
(2)DS,ES,FS,GS:
(3)BP,SI,DI:
(4)AX,BX,CX,DX:
9.3.2 汇编语言与C语言的接口
1,模块连接法所谓模块连接法是指分别编译/汇编C语言源程序和汇编语言源程序,然后再将目标文件进行连接,最终形成可执行文件的混合编程方法。
⑴在TC中调用汇编子程序和变量要使汇编语言模块和TC模块正确地连接到一起,必须处理好两点:
①汇编模块必须采用和TC模块一致的存储模式;
②汇编模块还必须遵守与TC兼容的命名约定,命名约定包括段组命名约定和函数/变量命名约定。
TC调用汇编语言子程序的主要步骤。
a,在汇编语言编程方面
①使用和C相同的存储模式定义各个段空间,没有用到的段可以不定义。
②在汇编语言源程序中用PUBLIC伪指令声明C需要引用的子函数和变量。
③按照C语言调用协议从堆栈中取得入口参数。
④对参数进行处理,实现相应的功能。
⑤将返回值送入AX或者DX:AX中返回。
⑥使用汇编程序MASM汇编源程序形成目标文件。
b,在TC编程方面
①在C语言源程序中用extern语句声明汇编语言子函数和变量。
②在程序中像引用本地函数和变量一样,引用这些汇编语言子函数和变量。
③编译源程序形成目标文件。
④使用TLINK连接C语言和汇编语言的目标文件,形成可执行文件。
⑤执行程序进行验证和调试。
【例9-6】设TC源程序在小模式下编译连接,试编写一个供TC调用的汇编语言子函数max。
【例9-7】对例9-6中的C语言源程序callmax改用大模式编译连接,试编写汇编语言源程序实现max函数。
【例9-9】试用汇编语言编写供TC调用的子函数sort实现升序排序功能,要求sort函数实现综合考虑各种存储模式。sort函数在TC源程序中声明如下:
⑵汇编语言引用TC函数和变量
EXTRN函数名:函数类型
EXTRN变量名:变量类型汇编语言调用TC子程序的主要步骤。
a.在TC编程方面
①定义供汇编语言程序引用的全局变量。
②声明和实现供汇编语言程序引用的子函数。
③编译生成目标文件。
b.在汇编语言编程方面
①用EXTRN伪指令声明TC子函数和变量。
②按照C语言调用协议将调用参数压入堆栈。
③使用CALL指令调用TC的子函数。
④从AX或者DX:AX中取得返回值。
⑤修改SP寄存器的值,将调用参数清除出栈。
⑥使用汇编程序MASM汇编源程序形成目标文件。
⑦使用连接程序LINK连接汇编语言和C语言的目标文件形成可执行文件。
⑧执行程序进行验证和调试。
【例9-10】汇编语言程序调用TC子程序。
汇编语言程序调用TC子程序时要注意如下4点。
①入口参数应该按照C语言调用协议的规定自右向左地压入堆栈。
②TC编译程序在函数和变量名前自动加下划线“_”,所以在调用时应使用“CALL_max”指令而不是“CALL max”指令。
③TC子函数在返主时不会从堆栈中弹出入口参数,所以在调用结束取得返回值后,由汇编语言主程序完成入口参数的出栈。
④汇编语言主程序和TC子程序应采用一致的存储模式,注意调用时参数入栈和出栈的变化。
2,伪变量法
3,行内汇编法
asm<操作码><操作数><;或者换行符>
【例9-12】在行内汇编语句中引用构造型变量。
9.3.3 汇编语言与Pascal语言的接口
Pascal语言和汇编语言混合编程的步骤如下。
a.在汇编语言编程方面
①在汇编语言源程序中,用PUBLIC伪指令声明TP需要引用的子程序。
②按照Pascal语言调用协议从堆栈中取得各类入口参数。
③对参数进行处理,实现相应的功能。
④将返回值送入AX或者DX:AX中。
⑤使用带立即数的RET n指令返回,其中n的值为子程序入口参数的总字节数。
⑥使用汇编程序MASM汇编源程序形成目标文件。
b.在TP编程方面
①在TP源程序中用external语句声明汇编语言子程序。
②用$L语句声明外部子程序所在的目标文件。
③像引用标准子程序一样在程序中引用汇编语言于程序。
④编译源程序形成目标文件。
⑤连接Pascal语言和汇编语言的目标文件,形成可执行文件。
⑥执行程序,进行验证和调试。
其中步骤③、④、⑤可以在TP的集成开发环境(IDE)中通过菜单命令Run一次完成,不需要在DOS提示符下以命令行方式进行。
【例9-14】编写供Pascal语言程序调用的过程 maxch,要求实现对参数x和y的比较并保证返回时x>=y。
【例9-15】编写供Pascal语言程序调用的过程sort,要求实现对给定元素个数的数组进行降序排列。
8.参考资料:《IBM-PC汇编语言程序设计》沈美明
9.作业:P285 习题9
10.本章小结:
①本部分为汇编语言的高级编程,应该理解和熟悉。
②本部分要求灵活应用,不要死记硬背。