数据结构域算法设计-第7章 汇编语言与C/C++的混合编程 课件

上传人:woxinch****an2018 文档编号:44915968 上传时间:2018-06-14 格式:PPT 页数:35 大小:325KB
返回 下载 相关 举报
数据结构域算法设计-第7章 汇编语言与C/C++的混合编程 课件_第1页
第1页 / 共35页
数据结构域算法设计-第7章 汇编语言与C/C++的混合编程 课件_第2页
第2页 / 共35页
数据结构域算法设计-第7章 汇编语言与C/C++的混合编程 课件_第3页
第3页 / 共35页
数据结构域算法设计-第7章 汇编语言与C/C++的混合编程 课件_第4页
第4页 / 共35页
数据结构域算法设计-第7章 汇编语言与C/C++的混合编程 课件_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《数据结构域算法设计-第7章 汇编语言与C/C++的混合编程 课件》由会员分享,可在线阅读,更多相关《数据结构域算法设计-第7章 汇编语言与C/C++的混合编程 课件(35页珍藏版)》请在金锄头文库上搜索。

1、 朱 泽 民计算机科学与技术学院13995939009第7章 汇编语言与CC+的 混合编程教学重点n第7章介绍实际应用当中,常见的混合编程问题,重点是参数传递方法 混合编程的两种方式 模块连接的约定规则 模块连接的参数传递方法 C+代码优化2什么是混合编程n多种程序设计语言间,通过相互调用、参数 传递、共享数据结构和数据信息而形成程序 的过程就是混合编程n程序的大部分采用高级语言编写,以提高程 序的开发效率;在某些部分,利用汇编语言 编写,以提高程序的运行效率混合编程方法n嵌入式汇编q在C/C+语言中直接使用汇编语言语句,q简洁直观、功能较弱n模块连接q两种语言分别编写独立的程序模块,分别产生

2、 目标代码OBJ文件,然后进行连接,形成一个完整 的程序q使用灵活、功能强,要解决参数传递问题混合编程的关键问题n建立不同语言之间的接口q在不同格式的两种语言间提供有效的通 讯方式,作出符合两种语言调用约定的某 种形式说明,实现两种语言间的程序模块 互相调用、变量的相互传送以及参数和返 回值的正确使用7.1 Turbo C嵌入式汇编方式n格式 asm 操作码 操作数 n举例 asm mov ax,ds; asm pop ax; asm pop ds; asm ret; asm push ds /* asm语句是C程序中唯一可以用换行结尾 的语句 */ 若干注意事项n操作码支持8086/8087

3、指令或若干伪指令:qdb/dw/ddqextern n操作数是操作码可接受的数据:立即数、寄 存器名,还可以是C语言程序中的常量、变 量和标号等n内嵌的汇编语句可以用分号“;”结束,也可以 用换行符结束 n使用C的注释,如 / * * /n正确运用通用寄存器、标号等7访问C语言的数据n嵌入的汇编语句除可以使用指令允许的立即数、寄 存器名外,还可以使用C语言程序中的任何符号( 标识符),包括变量、常量、标号、函数名、寄存 器变量、函数参数等;C编译程序自动将它们转换 成相应汇编语言指令的操作数,并在标识符名前加 下划线。 n对于具有内嵌汇编语句的C程序,C编译器要调用汇 编程序进行汇编。n汇编程

4、序在分析一条嵌入式汇编指令的操作数时, 若遇到了一个标识符,它将在C程序的符号表中搜 索该标识符;但8086寄存器名不在搜索范围之内, 而且大小写形式的寄存器名都可以使用。 8访问C语言的数据例7.1:用嵌入汇编方式实现取两数较小值的函数min/* LT701.C */ int min(int var1,int var2) /* 用嵌入汇编语句实现的求较小值 */ asm mov ax,var1asm cmp ax,var2asm jle minexitasm mov ax,var2 minexit: return(_AX); /* 将寄存器AX的内容作为函数的返回值 */ main() /*

5、 C语言主程序 */ min(100,200); 注意事项9嵌入汇编的编译过程nC语言程序中含有嵌入式汇编语言语句时qC编译器首先将C代码的源程序(.c)编译成 汇编语言源文件(.asm)q然后激活汇编程序Turbo Assembler将产生 的汇编语言源文件编译成目标文件(.obj)q最后激活Tlink将目标文件链接成可执行文件 (.exe)。 10/ * LT702.C */ #include void upper(char *dest,char *src) asm mov si,src /* dest和src是地址指针 */ asm mov di,dest asm cld loop: a

6、sm lodsb/* C语言定义的标号 */ asm cmp al,a asm jb copy/* 转移到C的标号 */ asm cmp al,z asm ja copy /* 不是a到z之间的字符原样复制 */例7.21/2asm 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 chr100;upper(chr,str);prin

7、tf(“Origin string:n%sn“,str);printf(“Uppercase String:n%sn“,chr); 例7.22/2DEMO 例7.27.2 Turbo C模块连接方式要注意模块连接的约定规则q命名约定:汇编语言过程应采用C语言 类型 q声明约定q寄存器使用约定q存储模式约定:采用相同的存储模式参数传递是关键q通过堆栈传递入口参数q通过寄存器返回出口参数7.2.1 混合编程的约定规则13; 汇编语言子程序:lt703s.asm .model small,c;小型存储模式 .data msgdb Hello, C and Assembly ! $ .code PUB

8、LIC display displayproc mov ah,9;小型模式不必设置DS mov dx,offset msg ;寄存器AX和DX无须保护 int 21h ret displayendp end例7.31/27.2.2 编译和连接过程/* C语言程序:lt703.c */ extern void display(void); /* 说明display是外部函数 */ main() display(); 利用汇编程序编译汇编语言程序成目标代码文件: ML /c lt703s.asm 或 masm lt703s.asm利用C编译程序编译C程序、连接目标代码文件:TCC -c lt703

9、.c例7.32/2DEMO编译和连接过程n利用连接程序将各个目标代码文件连接在一起,得到 可执行程序文件,例如:TLINK libc0s lt703 lt703s,lt703.exe,libcsn注意:直接使用Turbo C的连接程序TLINK进行连接时 ,用户必须指定要连接的与存储模式一致的初始化模 块和函数库文件,并且初始化模块必须是第一个文件 。n编译和连接也可以利用命令行一次完成,一般格式为:nTCC -mx -I包含文件路径 -L库库文件路径 filename1 filename2 . 例如,上例可以利用如下命令:TCC -ms -Iinclude -Llib lt703.c lt7

10、03s.obj167.2.3 混合编程的参数传递Lt0701.c 的编译结果如教材P218mov ax,200push ax ;压入参数200(第2个参数)mov ax,100push ax ;压入参数100(第1个参数)call near ptr _min ;调用min(100,200)pop cx ;两条出栈指令用于平衡堆栈pop cx 17; 汇编语言子程序:lt704s.asm .model small,c PUBLIC min .code minproc;小型模式,为近过程 push bp mov bp,sp mov ax, bp+4;取第1个参数 cmp ax, bp+6 ;与第2

11、个参数比较 jle minexit mov ax, bp+6 ;保存返回值 minexit: pop bp ret minendp end例7.41/3图示large688L; 汇编语言子程序:lt704.asm .model small,c PUBLIC min .code minproc ,var1:word, var2:word mov ax,var1;取第1个参数 cmp ax,var2 ;与第2个参数比较 jle minexit mov ax,var2 ;保存返回值 minexit: pop bp ret minendp end例7.42/3/* C语言程序:lt704.c */ e

12、xtern int min(int,int); main() printf(“%d”,min(100,200); 小型模式编译程序和连接: TCC -ms -Iinclude -Llib lt704.c lt704s.obj大型模式编译程序和连接: TCC -ml -Iinclude -Llib lt704.c lt704l.obj例7.43/3例7.4的堆栈区堆栈段20061004偏移地址2BP小型模式堆栈段20081006段地址4偏移地址2BPBPSP大型模式217.3 汇编语言在Visual C+中的应用nVisual C+逐渐将MASM融合进去q嵌入汇编语言指令q调用汇编语言过程nVi

13、sual C+集成开发环境q编译汇编语言程序q调试汇编语言程序n应用之一:优化C+代码7.3.1 嵌入汇编语言指令n格式 _ _asm 指令 n举例 int power2(int num,int power) _ _asm mov eax,num mov ecx,power shl eax,cl / 返回 EAX=EAX(2CL) 7.3.2 调用汇编语言过程n必须遵循共同的约定规则q命名约定q声明约定q寄存器使用约定q存储模式约定q参数传递约定n采用一致的调用规范n声明共用函数和变量n正确传递入口参数和返回参数32位汇编语言过程n用.386p等处理器伪指令说明采用的指令集n32位逻辑段环境n

14、有些指令在32位段与16位段有差别n采用平展模式(flat)n汇编时采用选项/coff;汇编语言子程序:lt714f.asm .386p .model flat,c PUBLIC power2 .code power2 proc push ebp mov ebp,esp mov eax,ebp+8;取第1个参数 mov ecx,bp+12;取第2个参数 shl eax,cl pop ebp ret ;返回EAX power2 endp end例7.141/3图示例7.14的堆栈区堆栈段61258EIP4EBPEBPESP27;汇编语言子程序:lt714f.asm .386p .model fl

15、at,c PUBLIC power2 .code power2 PROC ,num:dword,power:dword mov eax,num;获取参数 mov ecx,power shl eax,cl;计算 ret ;EAX存放返回值 power2 ENDP end例7.142/3/ C+语言程序:lt714.cpp # include extern “c”int power2(int,int); void main(void) cout extern “C“ long isum(int,int *); int imin(int,int *); void main(void) const int SIZE=10;int arraySIZE;int temp;coutarraytemp;coutendl;cout“整数数据之和:t“isum(SIZE,array)endl;cout“其中最小值为:t“imin(SIZE,array)endl; 例7.15 1/4/求itmp个元素的数组iarray的最小数 int imin(int itmp,int iarray) _asm mov ecx,itmp jecxz minexit;个数为0,返回 dec ecx mov esi,iarray mov eax,esi jecxz minexit;个数为1,返回 m

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号