汇编语言与C-C++的混合编程.ppt
文本预览下载声明
企业资料网企业管理资料库、法规库、音乐库 第 7 章 教学重点 第7章介绍实际应用当中,常见的混合编程问题,重点是参数传递方法 混合编程的两种方式 模块连接的约定规则 模块连接的参数传递方法 什么是混合编程 多种程序设计语言间,通过相互调用、参数传递、共享数据结构和数据信息而形成程序的过程就是混合编程 程序的大部分采用高级语言编写,以提高程序的开发效率;在某些部分,利用汇编语言编写,以提高程序的运行效率 混合编程方法 嵌入式汇编—— 在C/C++语言中直接使用汇编语言语句, 简洁直观、功能较弱 模块连接—— 两种语言分别编写独立的程序模块,分别产生目标代码OBJ文件,然后进行连接,形成一个完整的程序 使用灵活、功能强,要解决参数传递问题 混合编程的关键问题 建立不同语言之间的接口 在不同格式的两种语言间提供有效的通讯方式,作出符合两种语言调用约定的某种形式说明,实现两种语言间的程序模块互相调用、变量的相互传送以及参数和返回值的正确使用 Turbo C嵌入式汇编方式 格式 asm 操作码 操作数 ;或换行 举例 asm mov ax,ds; asm pop ax; asm pop ds; asm ret; asm push ds 若干注意事项 操作码支持8086/8087指令或若干伪指令:db/dw/dd和extern 操作数是操作码可接受的数据:立即数、寄存器名,还可以是C语言程序中的常量、变量和标号等 内嵌的汇编语句可以用分号“;”结束,也可以用换行符结束 使用C的注释,如 / * … * / 正确运用通用寄存器、标号等 例7.2-1/2 / * LT702.C */ #include stdio.h 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-2/2 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); } Turbo C模块连接的约定规则 命名约定 汇编语言过程应采用C语言类型 声明约定 C对调用的外部过程、变量等采用EXTERN说明 汇编语言程序的标识符用public操作符定义 寄存器使用约定 存储模式约定 采用相同的存储模式 参数传递约定:堆栈和共享变量 例7.3-1/2 ; 汇编语言子程序:lt703s.asm .model small,c ;采用小型存储模式 .data msg db ’Hello, C and Assembly ! $’ .code PUBLIC display display proc ;过程名加有下划线 mov ah,9 ;小型模式不必设置DS mov dx,offset msg ;寄存器AX和DX无须保护 int 21h ret display endp end 例7.3-2/2 /* C语言程序:lt703.c */ extern void display(void); /* 说明display是外部函数 */ main() { display(); } 例7.4-1/3 ; 汇编语言子程序:lt704s.asm .model small,c PUBLIC min .code min proc ;小型模式,为近过程 push bp mov bp,sp mov ax,[bp+4] ;取第1个参数 cmp ax,[bp+6] ;与第2个参数比较 jle minexit mov ax,[bp+6] ;保存返回值 minexit: pop bp ret min endp end 例7.4的堆栈区 例7.4-2/3 ; 汇编语言子程序:lt704.asm .model small,c PUBLIC min .code min pr
显示全部