第9章多模块程序设计与混合编程 教学目的:掌握汇编语言多模块程序设计和汇编语言与髙级语言之间混合编 程的基本概念、技术和方法 2.教学要求 ①理解多模块程序设计的基本概念 ②掌握汇编语言程序的多模块连接 ③了解多模块之间段的连接与模块间的交叉访问 ④理解汇编语言与高级程序的连接的原理。 ⑤掌握汇编语言与C语言的接口的实现方法 ⑥掌握汇编语言与 Pascal语言的接口的实现方法 3.教学重点 ①汇编语言与C语言的接口的实现 ②汇编语言与 Pascal语言的接口的实现 4.掌握难点: ①连接的原理 5.教学进程安排:P247~285 6.教学方法: 课堂讲授 7.教学内容摘要 9.1多模块程序设计的基本概念 一个复杂程序可以分成若干个模块,可由不同人员分头完成 2.每个模块的任务明确,便于理解; 3.单个模块易于编写和调试 4.便于程序的维护和修改 5.可以直接利用己有的模块 9.2汇编语言程序的多模块连接 9.2.1多模块之间段的连接 1. SEGMENT语句提供的连接信息 段名 SEGMENT[定位类型][组合类型][’类别’]
第 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调用协议
段名 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:AR,其中D中存放高字,AX中存放低字 (4)如果返回值大小超过双字则存放在系统静态变量存储区中,指向这个静态变量 存储区的指针值在AX(近指针)或者DX:AX(远指针)内 (5)在子程序完成预先定义的功能返回主程序时,C语言调用协议是由主程序来完 成参数出栈,而Paca语言调用协议却是由子程序来完成参数出栈工作的 3.寄存器保护规则 寄存器保护规则把CPU内部寄存器分为如下4类 (1)CS, IP, SS, SP, FLAGS (3)BP, SI, DI: (4)AX, BX, CX, DX 9.3.2汇编语言与c语言的接口 1.模块连接法 所谓模块连接法是指分别编译/汇编C语言源程序和汇编语言源程序,然后再将目标 文件进行连接,最终形成可执行文件的混合编程方法 (1)在TC中调用汇编子程序和变量 要使汇编语言模块和TC模块正确地连接到一起,必须处理好两点: D汇编模块必须采用和TC模块一致的存储模式; ②汇编模块还必须遵守与TC兼容的命名约定,命名约定包括段组命名约定和函数变 量命名约定。 TC调用汇编语言子程序的主要步骤。 a.在汇编语言编程方面 ①使用和C相同的存储模式定义各个段空间,没有用到的段可以不定义。 ②在汇编语言源程序中用 PUBLIC伪指令声明C需要引用的子函数和变量 ③按照C语言调用协议从堆栈中取得入口参数。 ④对参数进行处理,实现相应的功能 ⑤将返回值送入AX或者DX:AX中返回。 ⑥使用汇编程序MASM汇编源程序形成目标文件。 b.在T编程方面 ①在C语言源程序中用 extern语句声明汇编语言子函数和变量。 ②在程序中像引用本地函数和变量一样,引用这些汇编语言子函数和变量
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调用的汇编语言子函 maxo 例9-7】对例9-6中的C语言源程序 climax改用大模式编译连接,试编写汇编语 言源程序实现max函数。 【例9-9】试用汇编语言编写供TC调用的子函数sort实现升序排序功能,要求sort 函数实现综合考虑各种存储模式。sort函数在TC源程序中声明如下: (2)汇编语言引用TC函数和变量 EXTRN函数名:函数类型 EXTRN变量名:变量类型 编语言调用TC子程序的主要步骤。 a.在T编程方面 ①定义供汇编语言程序引用的全局变量 ②声明和实现供汇编语言程序引用的子函数。 ③编译生成目标文件 b.在汇编语言编程方面 ①用 EXTRN伪指令声明TC子函数和变量 ②按照C语言调用协议将调用参数压入堆栈。 ③使用CALL指令调用TC的子函数 ④从AX或者DX:AK中取得返回值 ⑤修改$P寄存器的值,将调用参数清除出栈 ⑥使用汇编程序MASM汇编源程序形成目标文件。 ⑦使用连接程序LINK连接汇编语言和C语言的目标文件形成可执行文件 ⑧执行程序进行验证和调试。 【例9-10】汇编语言程序调用TC子程序 编语言程序调用TC子程序时要注意如下4点。 ①入口参数应该按照C语言调用协议的规定自右向左地压入堆栈 ②TC编译程序在函数和变量名前自动加下划线“”,所以在调用时应使用“ CALL max” 指令而不是“ CALL max”指令 ③TC子函数在返主时不会从堆栈中弹出入口参数,所以在调用结束取得返回值后,由 汇编语言主程序完成入口参数的出栈 ④汇编语言主程序和TC子程序应采用一致的存储模式,注意调用时参数入栈和出栈 的变化。 2.伪变量法
③编译源程序形成目标文件。 ④使用 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.33汇编语言与 Pasca语言的接口 Pascal语言和汇编语言混合编程的步骤如下 a在汇编语言编程方面 ①在汇编语言源程序中,用 PUBLIC伪指令声明TP需要引用的子程序 ②按照 Pascal语言调用协议从堆栈中取得各类入口参数。 ③对参数进行处理,实现相应的功能 ④将返回值送入AX或者DX:AX中 ⑤使用带立即数的RETn指令返回,其中n的值为子程序入口参数的总字节数 ⑥使用汇编程序MASM汇编源程序形成目标文件。 b在TP编程方面 ①在TP源程序中用 external语句声明汇编语言子程序 ②用$L语句声明外部子程序所在的目标文件 ③像引用标准子程序一样在程序中引用汇编语言于程序。 ④编译源程序形成目标文件 ⑤连接 Pascal语言和汇编语言的目标文件,形成可执行文件。 ⑥执行程序,进行验证和调试 其中步骤③、④、⑤可以在TP的集成开发环境(IDE)中通过菜单命令Run一次完成 不需要在DS提示符下以命令行方式进行 【例914】编写供Paca语言程序调用的过程 maxch,要求实现对参数x和y的比较 并保证返回时x>=yo 【例915】编写供Paca语言程序调用的过程sort,要求实现对给定元素个数的数组 进行降序排列。 8.参考资料:《IBM-PC汇编语言程序设计》沈美明 9.作业:P285习题9 10.本章小结 ①本部分为汇编语言的高级编程,应该理解和熟悉
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.本章小结: ①本部分为汇编语言的高级编程,应该理解和熟悉
②本部分要求灵活应用,不要死记硬背
②本部分要求灵活应用,不要死记硬背