第6章
第 6 章
教学重点 第6章介绍实际应用当中 常见的混合编程问题,重点 是参数传递方法 汇编言 √混合编程的两种方式 与0/0H+的混食程 √模块连接的约定规则 √模块连接的参数传递方法 HHH
教学重点 第6章介绍实际应用当中, 常见的混合编程问题,重点 是参数传递方法 ✓混合编程的两种方式 ✓模块连接的约定规则 ✓模块连接的参数传递方法
第6 什么是混合编程 >多种程序设计语言间,通过相互调用 参数传递、共享数据结构和数据信息 而形成程序的过程就是混合编程 >程序的大部分采用高级语言编写,以 提高程序的开发效率;在某些部分, 利用汇编语言编写,以提高程序的运 行效率
第6章 什么是混合编程 ➢多种程序设计语言间,通过相互调用、 参数传递、共享数据结构和数据信息 而形成程序的过程就是混合编程 ➢程序的大部分采用高级语言编写,以 提高程序的开发效率;在某些部分, 利用汇编语言编写,以提高程序的运 行效率
第6 混合编程方法 >嵌入式汇编 ■在CC++语言中直接使用汇编语言语句, ■简洁直观、功能较弱 >模块连接 两种语言分别编写独立的程序模块,分别 产生目标代码OBJ文件,然后进行连接, 形成一个完整的程序 使用灵活、功能强,要解决参数传递问题
第6章 混合编程方法 ➢嵌入式汇编—— ◼ 在C/C++语言中直接使用汇编语言语句, ◼ 简洁直观、功能较弱 ➢模块连接—— ◼ 两种语言分别编写独立的程序模块,分别 产生目标代码OBJ文件,然后进行连接, 形成一个完整的程序 ◼ 使用灵活、功能强,要解决参数传递问题
第6 混合编程的关键问题 >建立不同语言之间的接口 >在不同格式的两种语言间提供有 效的通讯方式,作出符合两种语 言调用约定的某种形式说明,实 现两种语言间的程序模块互相调 用、变量的相互传送以及参数和 返回值的正确使用
第6章 混合编程的关键问题 ➢建立不同语言之间的接口 ➢在不同格式的两种语言间提供有 效的通讯方式,作出符合两种语 言调用约定的某种形式说明,实 现两种语言间的程序模块互相调 用、变量的相互传送以及参数和 返回值的正确使用
第6 Turbo c嵌入式汇编方式 >格式 asm操作码操作数 >举例 asm mov ax, ds, asm pop ax asm pop ds; asm ret asm push ds
第6章 Turbo C嵌入式汇编方式 ➢格式 asm 操作码 操作数 ➢举例 asm mov ax,ds; asm pop ax; asm pop ds; asm ret; asm push ds
第6 若干注意事项 操作码支持80868087指令或若干伪指 令:db/dw/d和 extern >操作数是操作码可接受的数据:立即数、 寄存器名,还可以是C语言程序中的常 量、变量和标号等 >内嵌的汇编语句可以用分号“;”结束, 也可以用换行符结束 >使用C的注释,如/*∴.*/ 正确运用通用寄存器、标号等
第6章 若干注意事项 ➢操作码支持8086/8087指令或若干伪指 令:db/dw/dd和extern ➢操作数是操作码可接受的数据:立即数、 寄存器名,还可以是C语言程序中的常 量、变量和标号等 ➢内嵌的汇编语句可以用分号“;”结束, 也可以用换行符结束 ➢使用C的注释,如/ * … * / ➢正确运用通用寄存器、标号等
例6.2-1/2 /★工T602.C* include void upper(char *dest, char *src) asm ov s五,sc /*dest和sxc是地址指针*/ asm mov di, dest asm cld loop: asm lodsb /*C语言定义的标号*/ asm cmp ali'a' asm jb copy/*转移到c的标号*/ asm cmp al,'z' asi ja copy /不是’a′到’z之间的字符原样复制*
/ * LT602.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’之间的字符原样复制*/ 例6.2-1/2
例6.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: \n%s\n",str)i printf("Uppercase string: \nos\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); } 例6.2-2/2
第6 Turbo c模块连接的约定规则 >命名约定 汇编语言过程中被c语言调用的标识符前要加上 下划线“” >声明约定 ■C对调用的外部过程、变量等采用 EXTERN说明 汇编语言程序的标识符用 public操作符定义 >寄存器使用约定 >存储模式约定 ■采用相同的存储模式 >参数传递约定:堆栈和共享变量
第6章 Turbo C模块连接的约定规则 ➢ 命名约定 ◼ 汇编语言过程中被C语言调用的标识符前要加上 下划线“_” ➢ 声明约定 ◼ C对调用的外部过程、变量等采用EXTERN说明 ◼ 汇编语言程序的标识符用public操作符定义 ➢ 寄存器使用约定 ➢ 存储模式约定 ◼ 采用相同的存储模式 ➢ 参数传递约定:堆栈和共享变量