汇编语言与的混合编程.ppt

上传人:石*** 文档编号:48391407 上传时间:2022-10-06 格式:PPT 页数:37 大小:1.58MB
返回 下载 相关 举报
汇编语言与的混合编程.ppt_第1页
第1页 / 共37页
汇编语言与的混合编程.ppt_第2页
第2页 / 共37页
点击查看更多>>
资源描述

《汇编语言与的混合编程.ppt》由会员分享,可在线阅读,更多相关《汇编语言与的混合编程.ppt(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

2、功能较弱n模块连接q两种语言分别编写独立的程序模块,分别产生目标代码OBJ文件,然后进行连接,形成一个完整的程序q使用灵活、功能强,要解决参数传递问题现在学习的是第4页,共37页混合编程的关键问题混合编程的关键问题n建立不同语言之间的接口q在不同格式的两种语言间提供有效的通讯方式,作出符合两种语言调用约定的某种形式说明,实现两种语言间的程序模块互相调用、变量的相互传送以及参数和返回值的正确使用现在学习的是第5页,共37页7.1 Turbo C嵌入式汇编方式嵌入式汇编方式n格式格式asm操作码操作码操作数操作数n举例举例asmmovax,ds;asmpopax;asmpopds;asmret;a

3、smpushds/*asm语句是语句是C程序中唯一可以用换行结尾的程序中唯一可以用换行结尾的语句语句*/现在学习的是第6页,共37页若干注意事项若干注意事项n操作码支持8086/8087指令或若干伪指令:qdb/dw/ddqextern n操作数是操作码可接受的数据:立即数、寄存器名,还可以是C语言程序中的常量、变量和标号等n内嵌的汇编语句可以用分号“;”结束,也可以用换行符结束 n使用C的注释,如/*/n正确运用通用寄存器、标号等7现在学习的是第7页,共37页访问访问C语言的数据语言的数据n嵌入的汇编语句除可以除可以使用指令允许的立即数、寄存器名外,还可以还可以使用C语言程序中的任何符号(标

4、识符),包括包括变量、常量、标号、函数名、寄存器变量、函数参数等;C编译程序自动将它们转换成相应汇编语言指令的操作数,并在标识符名前加下划线。n对于具有内嵌汇编语句的对于具有内嵌汇编语句的C程序,程序,C编译器要调用汇编程编译器要调用汇编程序进行汇编序进行汇编。n汇编程序在分析一条嵌入式汇编指令的操作数时,若遇到了一个标识符,它将在C程序的符号表中搜索该标识符;但8086寄存器名不在搜索范围之内,而且大小写形式的寄存器名都可以使用。8现在学习的是第8页,共37页访问访问C语言的数据语言的数据例例7.1:用嵌入汇编方式实现取两数较小值的函数:用嵌入汇编方式实现取两数较小值的函数min/*LT70

5、1.C*/intmin(intvar1,intvar2)/*用嵌入汇编语句实现的求较小值用嵌入汇编语句实现的求较小值*/asmmovax,var1asmcmpax,var2asmjleminexitasmmovax,var2minexit:return(_AX);/*将寄存器将寄存器AX的内容作为函数的返回值的内容作为函数的返回值*/main()/*C语言主程序语言主程序*/min(100,200);注意事项注意事项9现在学习的是第9页,共37页嵌入汇编的编译过程嵌入汇编的编译过程nC语言程序中含有嵌入式汇编语言语句时qC编译器首先将首先将C代码的源程序(代码的源程序(.c)编译成汇编语)编译

6、成汇编语言源文件(言源文件(.asm)q然后激活汇编程序然后激活汇编程序TurboAssembler将产生的汇编将产生的汇编语言源文件编译成目标文件(语言源文件编译成目标文件(.obj)q最后激活最后激活Tlink将目标文件链接成可执行文件将目标文件链接成可执行文件(.exe)。)。10现在学习的是第10页,共37页/*LT702.C*/#include void upper(char*dest,char*src)asm mov si,src/*dest和和src是地址指针是地址指针*/asm mov di,destasm cldloop:asm lodsb/*C语言定义的标号语言定义的标号*

7、/asm cmp al,aasm jb copy/*转移到转移到C的标号的标号*/asm cmp al,zasm ja copy/*不是不是a到到z之间的字符原样复制之间的字符原样复制*/例例7.27.21/21/2现在学习的是第11页,共37页asm sub al,20h/*小写字母转换成大写小写字母转换成大写*/copy:asm stosbasm and al,al/*C语言中,字符串用语言中,字符串用NULL(0)结尾)结尾*/asm jnz loopmain()/*主程序主程序*/char str=This Started Out As Lowercase!;char chr100;u

8、pper(chr,str);printf(Origin string:n%sn,str);printf(Uppercase String:n%sn,chr);例例7.27.22/22/2DEMO例7.2现在学习的是第12页,共37页7.2 Turbo C模块连接方式模块连接方式要注意模块连接的约定规则q命名约定:汇编语言过程应采用C语言类型q声明约定q寄存器使用约定q存储模式约定:采用相同的存储模式参数传递是关键q通过堆栈传递入口参数q通过寄存器返回出口参数7.2.1 混合编程的约定规则混合编程的约定规则13现在学习的是第13页,共37页;汇编语言子程序:汇编语言子程序:lt703s.asm.

9、model small,c;小型存储模式小型存储模式.datamsgdb Hello,C and Assembly!$.codePUBLIC displaydisplayprocmov ah,9;小型模式不必设置小型模式不必设置DSmov dx,offset msg;寄存器寄存器AX和和DX无须保护无须保护int 21hretdisplayendpend例例7.37.31/21/27.2.2 编译和连接过程编译和连接过程现在学习的是第14页,共37页/*C语言程序:语言程序:lt703.c*/extern void display(void);/*说明说明display是外部函数是外部函数*/

10、main()display();利用汇编程序编译汇编语言程序成目标代码文件:利用汇编程序编译汇编语言程序成目标代码文件:ML/c lt703s.asm 或或 masm lt703s.asm利用利用C编译程序编译编译程序编译C程序、连接目标代码文件:程序、连接目标代码文件:TCC -c lt703.c例例7.37.32/22/2DEMO现在学习的是第15页,共37页编译和连接过程编译和连接过程n利用连接程序将各个目标代码文件连接在一起,得到可执利用连接程序将各个目标代码文件连接在一起,得到可执行程序文件行程序文件,例如:TLINK libc0s lt703 lt703s,lt703.exe,li

11、bcsn注意注意:直接使用TurboC的连接程序TLINK进行连接时,用户必须指定要连接的与存储模式一致的初始化模块和函数库文件,并且初始化模块必须是第一个文件。n编译和连接也可以利用命令行一次完成编译和连接也可以利用命令行一次完成,一般格式为:nTCC-mx-I包含文件路径包含文件路径-L库库文件路径文件路径 filename1 filename2.例如,上例可以利用如下命令:TCC-ms-Iinclude-Llib lt703.c lt703s.obj16现在学习的是第16页,共37页7.2.3 混合编程的参数传递混合编程的参数传递Lt0701.c的编译结果如教材如教材P218movax,

12、200pushax;压入参数200(第2个参数)movax,100pushax;压入参数100(第1个参数)callnearptr_min;调用min(100,200)popcx;两条出栈指令用于平衡堆栈popcx17现在学习的是第17页,共37页;汇编语言子程序:汇编语言子程序:lt704s.asm.model small,cPUBLIC min.codeminproc;小型模式,为近过程小型模式,为近过程push bpmov bp,spmov ax,bp+4;取第取第1个参数个参数cmp ax,bp+6;与第与第2个参数比较个参数比较jle minexitmov ax,bp+6;保存返回值

13、保存返回值minexit:pop bpretminendpend例例7.47.41/31/3图示示large688L现在学习的是第18页,共37页;汇编语言子程序:汇编语言子程序:lt704.asm.model small,cPUBLIC min.codeminproc,var1:word,var2:wordmov ax,var1;取第取第1个参数个参数cmp ax,var2;与第与第2个参数比较个参数比较jle minexitmov ax,var2;保存返回值保存返回值minexit:pop bpretminendpend例例7.47.42/32/3现在学习的是第19页,共37页/*C语言程

14、序:语言程序:lt704.c*/extern 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.47.43/33/3现在学习的是第20页,共37页7.3 汇编语言在汇编语言在Visual C+中的应用中的应用nVisualC+逐渐将MASM融合进去q嵌入汇编语言指令q调用汇编语言过程nVisu

15、alC+集成开发环境q编译汇编语言程序q调试汇编语言程序n应用之一:优化C+代码现在学习的是第22页,共37页7.3.1 嵌入汇编语言指令嵌入汇编语言指令n格式_asm指令指令n举例intpower2(intnum,intpower)_asmmoveax,nummovecx,powershleax,cl/返回返回EAX=EAX(2CL)现在学习的是第23页,共37页7.3.2 调用汇编语言过程调用汇编语言过程n必须遵循共同的约定规则q命名约定q声明约定q寄存器使用约定q存储模式约定q参数传递约定n采用一致的调用规范n声明共用函数和变量n正确传递入口参数和返回参数现在学习的是第24页,共37页3

16、2位汇编语言过程位汇编语言过程n用.386p等处理器伪指令说明采用的指令集n32位逻辑段环境n有些指令在32位段与16位段有差别n采用平展模式(flat)n汇编时采用选项/coff现在学习的是第25页,共37页;汇编语言子程序:汇编语言子程序:lt714f.asm.386p.model flat,cPUBLIC power2.codepower2procpush ebpmov ebp,espmov eax,ebp+8;取第取第1个参数个参数mov ecx,bp+12;取第取第2个参数个参数shl eax,clpop ebpret;返回返回EAXpower2endpend例例7.147.141/

17、31/3图示现在学习的是第26页,共37页;汇编语言子程序:汇编语言子程序:lt714f.asm.386p.modelflat,cPUBLICpower2.codepower2PROC,num:dword,power:dwordmoveax,num;获取参数获取参数movecx,powershleax,cl;计算计算ret;EAX存放返回值存放返回值power2ENDPend例例7.147.142/32/3现在学习的是第28页,共37页/C+语言程序:语言程序:lt714.cpp#include extern“c”int power2(int,int);void main(void)cout“

18、2的的6次方乘次方乘5等于:等于:t”;coutpower2(5,6)endl;将汇编语言程序汇编成目标代码文件:将汇编语言程序汇编成目标代码文件:ML/c/coff lt714f.asm在在Visual C+6.0编译环境下创建项目,编译环境下创建项目,插入汇编成的目标代码文,然后编译连接插入汇编成的目标代码文,然后编译连接例例7.147.143/33/3现在学习的是第29页,共37页/C+程序:程序:LT715.CPP#include extern C long isum(int,int*);int imin(int,int*);void main(void)const int SIZE=

19、10;int arraySIZE;int temp;cout请输入请输入10个整数:个整数:endl;for(temp=0;temparraytemp;coutendl;cout整数数据之和:整数数据之和:tisum(SIZE,array)endl;cout其中最小值为:其中最小值为:timin(SIZE,array)endl;例例7.157.151/41/4现在学习的是第30页,共37页/求求itmp个元素的数组个元素的数组iarray的最小数的最小数int imin(int itmp,int iarray)_asm mov ecx,itmpjecxz minexit;个数为个数为0,返回,

20、返回dec ecxmov esi,iarraymov eax,esijecxz minexit;个数为个数为1,返回,返回minlp:add esi,4cmp eax,esi;比较两个数据的大小比较两个数据的大小jle nochangemov eax,esi;取得较小值取得较小值nochange:loop minlpminexit:例例7.157.152/42/4现在学习的是第31页,共37页;汇编语言子程序:汇编语言子程序:LT715F.ASM.386p.model flat,c.code;32位有符号数据的求和过程位有符号数据的求和过程isumproc uses ecx esi,count

21、:dword,darray:PTRmov ecx,count;个数为个数为0,和为,和为0 xor edx,edxxor eax,eaxjecxz sumexitmov esi,darray;个数为个数为1,和为本身,和为本身mov eax,esidec ecxjecxz sumexit例例7.157.153/43/4现在学习的是第32页,共37页sumlp:add esi,4add eax,esi;计算低计算低32位位adc edx,0;计算高计算高32位位loop sumlpsumexit:retisumendpend例例7.157.154/44/4将汇编语言程序汇编成目标代码文件:将汇编

22、语言程序汇编成目标代码文件:ML/c/coff lt715f.asm在在Visual C+6.0编译环境下创建项目,编译环境下创建项目,插入汇编成的目标代码文件,然后编译连接插入汇编成的目标代码文件,然后编译连接现在学习的是第33页,共37页7.3.3 使用汇编语言优化使用汇编语言优化C+代码代码n例7.16:在整数数组查找一个数值,查找过程需要进行大量循环nC+代码(lt716.cpp)qDebug调试版本:81000(0.046ms)qRelease发布版本:31000(0.018ms)n嵌入汇编语言编写查找函数q使用串操作指令:41000(0.023ms)q不使用串操作指令:31000(

23、0.018ms)n在简单情况下,VisualC+的优化技术已经非常有效;但仍然可用汇编代码进行改进34现在学习的是第34页,共37页7.3.4 使用使用Visual C+开发汇编语言程序开发汇编语言程序n新建工程项目,选择32位控制台或窗口应用程序q输入磁盘目录,工程名称,并选择创建一个空白工程n新建汇编语言源程序文件q输入源程序文件名以及扩展名ASM,加入工程项目n通过工程菜单的设置命令展开工程设置窗口q在命令文本框中输入进行汇编的命令q在输出文本框输入汇编后目标模块文件名n调用创建命令进行汇编语言程序的汇编和连接n注意在VisualC+环境确定包含文件的路径35现在学习的是第35页,共37

24、页汇编语言程序的调试过程汇编语言程序的调试过程n工具菜单的选项命令展开调试标签页进行设置q通用下选中十六进制显示q反汇编窗口下要选中代码字节q存储器窗口下选中固定宽度,后面填入数字16n在编辑窗口源程序的语句行,按F9键,设置断点n使用运行、单步执行等命令进行n开各种窗口观察程序当前的运行状态q存储器窗口查看变量q反汇编窗口有反汇编的实际执行代码q寄存器窗口显示处理器的寄存器内容36现在学习的是第36页,共37页第第7章章 教学要求教学要求1.熟悉嵌入式和模块连接两种混合编程方法2.了解模块连接混合编程的约定规则3.熟悉模块链接混合编程的参数传递方法4.了解32位环境的混合编程方法37现在学习的是第37页,共37页

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

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁