第7章
第 7 章
教学重点 第7章介绍实际应用当中, 常见的混合编程问题,重点 是参数传递方法 汇编言 √混合编程的两种方式 与0/0H+的混食程 √模块连接的约定规则 √模块连接的参数传递方法 √C++代码优化 HHH
教学重点 第7章介绍实际应用当中, 常见的混合编程问题,重点 是参数传递方法 ✓混合编程的两种方式 ✓模块连接的约定规则 ✓模块连接的参数传递方法 ✓C++代码优化
第7章 什么是混合编程 多种程序设计语言间,通过相互调用 参数传递、共享数据结构和数据信息 而形成程序的过程就是混合编程 >程序的大部分采用高级语言编写,以 提高程序的开发效率;在某些部分, 利用汇编语言编写,以提高程序的运 行效率
第 7 章 什么是混合编程 ➢多种程序设计语言间,通过相互调用、 参数传递、共享数据结构和数据信息 而形成程序的过程就是混合编程 ➢程序的大部分采用高级语言编写,以 提高程序的开发效率;在某些部分, 利用汇编语言编写,以提高程序的运 行效率
第7章 混合编程方法 嵌入式汇编 ■在CC++语言中直接使用汇编语言语句, ■简洁直观、功能较弱 >模块连接 ■两种语言分别编写独立的程序模块,分别 产生目标代码OBJ文件,然后进行连接, 形成一个完整的程序 ■使用灵活、功能强,要解决参数传递问题
第 7 章 混合编程方法 ➢嵌入式汇编—— ◼在C/C++语言中直接使用汇编语言语句, ◼简洁直观、功能较弱 ➢模块连接—— ◼两种语言分别编写独立的程序模块,分别 产生目标代码OBJ文件,然后进行连接, 形成一个完整的程序 ◼使用灵活、功能强,要解决参数传递问题
第7章 混合编程的关键问题 建立不同语言之间的接口 >在不同格式的两种语言间提供有效的通讯方 式,作出符合两种语言调用约定的某种形式 说明,实现两种语言间的程序模块互相调用 变量的相互传送以及参数和返回值的正确使 用
第 7 章 混合编程的关键问题 ➢建立不同语言之间的接口 ➢在不同格式的两种语言间提供有效的通讯方 式,作出符合两种语言调用约定的某种形式 说明,实现两种语言间的程序模块互相调用、 变量的相互传送以及参数和返回值的正确使 用
第7章 7.1 Turbo c嵌入式汇编方式 格式 asm操作码操作数 >举例 asm mov ax, as, asm pop ax; asm pop ds; asm ret asm push ds
第 7 章 7.1 Turbo C嵌入式汇编方式 ➢格式 asm 操作码 操作数 ➢举例 asm mov ax,ds; asm pop ax; asm pop ds; asm ret; asm push ds
第7章 若干注意事项 >操作码支持8086/8087指令或若干伪指令: db/dwdd和 extern >操作数是操作码可接受的数据:立即数、 寄存器名,还可以是C语言程序中的常量、 变量和标号等 >内嵌的汇编语句可以用分号“;”结束,也可 以用换行符结束 >使用C的注释,如/…*/ >正确运用通用寄存器、标号等
第 7 章 若干注意事项 ➢操作码支持8086/8087指令或若干伪指令: db/dw/dd和extern ➢操作数是操作码可接受的数据:立即数、 寄存器名,还可以是C语言程序中的常量、 变量和标号等 ➢内嵌的汇编语句可以用分号“;”结束,也可 以用换行符结束 ➢使用C的注释,如/ * … * / ➢正确运用通用寄存器、标号等
例7.2-1/2 *工702.C* #立nc1ude void upper(char *dest, char *src) asin Iov S1, SIC /*dest和sxc是地址指针*/ asm moy di, dest asm cld loop: asm lodsb /*C语言定义的标号*/ asm cmp al,'a' asm jb copy/*转移到c的标号*/ asm cmp al,'z' asi Ja copy /不是’a到z之间的字符原样复制*
/ * LT702.C */ #include void upper(char *dest,char *src) { asm mov si,src /* dest和src是地址指针 */ asm mov di,dest asm cld loop: asm lodsb /* C语言定义的标号 */ asm cmp al,'a' asm jb copy /* 转移到C的标号 */ asm cmp al,'z' asm ja copy /* 不是’a’到’z’之间的字符原样复制*/ 例7.2-1/2
例7.2-2/2 asm sub a1,20h/*小写字母转换成大写* copy: asm stosb asm and al, al /*C语言中,字符串用NU(0)结尾*/ asm inz loop main()/*主程序*/ char str[]=This started Out As Lowercase!i char chr [100]; upper(chr, str)i printf ("Origin string: ns\n",str)i printf("Uppercase String: \n%s\n",chr)i
asm sub al,20h /*小写字母转换成大写*/ copy: asm stosb asm and al,al /* C语言中,字符串用NULL(0)结尾 */ asm jnz loop } main() /* 主程序 */ { char str[]="This Started Out As Lowercase!"; char chr[100]; upper(chr,str); printf("Origin string:\n%s\n",str); printf("Uppercase String:\n%s\n",chr); } 例7.2-2/2
第7章 7.2 Turbo c模块连接方式 √要注意模块连接的约定规则 ■命名约定:汇编语言过程应采用c语言类型 ■声明约定 ■寄存器使用约定 存储模式约定:采用相同的存储模式 √参数传递是关键 ■通过堆栈传递入口参数 ■通过寄存器返回出口参数
第 7 章 7.2 Turbo C模块连接方式 ✓要注意模块连接的约定规则 ◼ 命名约定:汇编语言过程应采用C语言类型 ◼ 声明约定 ◼ 寄存器使用约定 ◼ 存储模式约定:采用相同的存储模式 ✓参数传递是关键 ◼ 通过堆栈传递入口参数 ◼ 通过寄存器返回出口参数