收藏 分销(赏)

汇编与CC--的混合编程.pptx

上传人:丰**** 文档编号:4224426 上传时间:2024-08-26 格式:PPTX 页数:47 大小:251KB
下载 相关 举报
汇编与CC--的混合编程.pptx_第1页
第1页 / 共47页
汇编与CC--的混合编程.pptx_第2页
第2页 / 共47页
汇编与CC--的混合编程.pptx_第3页
第3页 / 共47页
汇编与CC--的混合编程.pptx_第4页
第4页 / 共47页
汇编与CC--的混合编程.pptx_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、汇编与汇编与C/C+的混合编程的混合编程要要调调用用带带参参数数过过程程定定义义的的过过程程,不不应应采采用用CALL指令,因为比较烦琐指令,因为比较烦琐应该采用过程调用伪指令应该采用过程调用伪指令INVOKE使使 用用 INVOKE伪伪 指指 令令 的的 前前 提提 是是 需需 要要 用用PROTO伪指令对过程进行声明伪指令对过程进行声明过程声明和过程调用伪指令过程声明和过程调用伪指令过程名过程名 PROC调用距离调用距离语言类型语言类型作用范围作用范围USES寄存器列表寄存器列表,参数参数:类型类型LOCAL参数表参数表;汇编语言语句汇编语言语句过程名过程名 ENDP过程声明伪指令:过程声

2、明伪指令:用于事先声明过程的结构用于事先声明过程的结构过程名过程名PROTO 调用距离调用距离 语言类型语言类型,参数参数:类型类型过程调用伪指令过程调用伪指令INVOKE 过程名过程名,参数参数,.如何调如何调用用调用距离调用距离调用距离调用距离可以是可以是NEAR16、NEAR32、FAR,表示该过程是近或,表示该过程是近或远调用。简化段格式中,缺省值由远调用。简化段格式中,缺省值由.model语句选择的存储模式决定。语句选择的存储模式决定。语言类型语言类型语言类型语言类型可以是任何有效的语言类型,可以是任何有效的语言类型,确定该过程采用的命名约定和调用约定;语确定该过程采用的命名约定和调

3、用约定;语言类型还可以由言类型还可以由.model伪指令指定伪指令指定语言类型语言类型CSYSCALLSTDCALLPASCALBASICFORTRAN命名约定命名约定名字前加下名字前加下划线划线名字前加下名字前加下划线划线名字变名字变大写大写名字大名字大写写名字大名字大写写参数传递顺序参数传递顺序从右到左从右到左从右到从右到左左(注)(注)从左到从左到右右从左到从左到右右从左到从左到右右平衡堆栈的程平衡堆栈的程序序调用程序调用程序被调用被调用程序程序被调用程序被调用程序被调用被调用程序程序被调用被调用程序程序被调用被调用程序程序保存保存BP是是是是是是允许允许VARARG参数参数是是是是是是

4、作用范围作用范围 作作用用范范围围可可以以是是PUBLIC、PRIVATE、EXPORT,表表示示该该过过程程是是否否对对其其他他模模块块可可见见。缺缺省省是是PUBLIC,表表示示其其他他模模块块可可见见;PRIVATE表表示示对对外外不不可可见见;EXPORT隐隐含含有有PUBLIC和和FAR,表表示示该该过过程程应应该该放放置置在在导导出表(出表(export entry table)。)。起始参数起始参数起始参数起始参数采用这个格式的采用这个格式的PROC伪伪指令,汇编系统将自动创建过程的起始指令,汇编系统将自动创建过程的起始代码(代码(Prologuecode)和收尾代码)和收尾代码

5、(Epiloguecode),用于传递堆栈参数),用于传递堆栈参数以及清除堆栈等。起始参数表示传送给以及清除堆栈等。起始参数表示传送给起始代码的参数;它必须使用尖括号起始代码的参数;它必须使用尖括号“”括起来,多个参数用逗号分隔。括起来,多个参数用逗号分隔。寄存器列表寄存器列表寄存器列表寄存器列表指通用寄存器名,指通用寄存器名,用空格分隔多个寄存器。只要利用用空格分隔多个寄存器。只要利用“USES寄存器列表寄存器列表”罗列该过程中罗列该过程中需要保存与恢复的寄存器,汇编系需要保存与恢复的寄存器,汇编系统将自动在起始代码产生相应的入统将自动在起始代码产生相应的入栈指令,并对应在收尾代码产生出栈指

6、令,并对应在收尾代码产生出栈指令。栈指令。参数参数参数参数类型类型表示过程使用的形参及类型。表示过程使用的形参及类型。在在16位段中,缺省的类型是字位段中,缺省的类型是字WORD,在,在32位位段中缺省的类型是双字段中缺省的类型是双字DWORD。参数类型可以是任何参数类型可以是任何MASM有效的类型或有效的类型或PTR(表示地址指针);在(表示地址指针);在C、SYSCALL、STDCALL语言类型中。语言类型中。PROC伪指令中使用参数,必须定义语言类型。伪指令中使用参数,必须定义语言类型。局部变量局部变量如如果果过过程程使使用用局局部部变变量量,紧紧接接着着过过程程定定义义伪伪指指令令PR

7、OC,可可以以采采用用一一条条或或多多条条LOCAL伪伪指指令说明。令说明。其其中中,可可选选的的“个个数数”表表示示同同样样类类型型数数据据的的个个数数,类类似似数数组组元元素素的的个个数数。在在16位位段段中中,缺缺省省的的类类型型是是字字WORD,在在32位位段段中中缺缺省省的的类类型型是是双双字字DWORD。使使用用LOCAL伪伪指指令令说说明明局局部部变变量量后后,汇汇编编系系统统将将自自动动利利用用堆堆栈栈存存放放该该变变量量.例例fig6-20new.asm此例该自此例该自fig6-20.asm,请注意比较。请注意比较。.386.MODELFLAT,stdcallExitProc

8、essPROTONEAR32stdcall,dwExitCode:DWORDMovePROTONEAR32C,:WORD,:BYTE,:BYTE,:BYTEincludeio.h;headerfileforinput/outputcrequ0dh;carriagereturncharacterLfequ0ah;linefeed.STACK4096;reserve4096-bytestack.DATA;reservestoragefordatapromptBYTEcr,Lf,Howmanydisks?,0numberBYTE16DUP(?)countword?messageBYTEcr,Lf,M

9、ovediskfromspindlesourceBYTE?BYTEtospindledestBYTE?BYTE.,0.CODEMovePROCNEAR32cuseseaxebx,countp:word,Sr:byte,Dst:byte,Spa:bytecmpcountp,1;NbrDisks=1?jneelseMore;skipifmorethan1movbx,wordptrSr;Sourcemovsource,bl;copycharactertooutputmovbx,wordptrDst;destinationmovdest,bl;copycharactertooutputoutputme

10、ssage;printlinejmpendIfOne;returnelseMore:deccountpINVOKEMove,countp,Sr,Spa,DstINVOKEMove,1,Sr,Dst,SpaINVOKEMove,countp,Spa,Dst,SrendIfOne:ret;returnMoveENDPstart:outputprompt;askfornumberofdisksinputnumber,16;readASCIIcharactersatoinumber;converttointegerINVOKEMove,ax,A,B,CINVOKEExitProcess,0;exitw

11、ithreturncode0PUBLICstart;makeentrypointpublicEND;endofsourcecode列表文件什么是混合编程什么是混合编程多种程序设计语言间,通过相互调用、多种程序设计语言间,通过相互调用、参数传递、共享数据结构和数据信息而参数传递、共享数据结构和数据信息而形成程序的过程就是混合编程形成程序的过程就是混合编程程序的大部分采用高级语言编写,以提程序的大部分采用高级语言编写,以提高程序的开发效率;在某些部分,利用高程序的开发效率;在某些部分,利用汇编语言编写,以提高程序的运行效率汇编语言编写,以提高程序的运行效率混合编程方法混合编程方法嵌入式汇编嵌入式汇

12、编在在C/C+语言中直接使用汇编语言语句,语言中直接使用汇编语言语句,简洁直观、功能较弱简洁直观、功能较弱模块连接模块连接两种语言分别编写独立的程序模块,分别两种语言分别编写独立的程序模块,分别产生目标代码产生目标代码OBJ文件,然后进行连接,文件,然后进行连接,形成一个完整的程序形成一个完整的程序使用灵活、功能强,要解决参数传递问题使用灵活、功能强,要解决参数传递问题混合编程的关键问题混合编程的关键问题建立不同语言之间的接口建立不同语言之间的接口在不同格式的两种语言间提供有效在不同格式的两种语言间提供有效的通讯方式,作出符合两种语言调的通讯方式,作出符合两种语言调用约定的某种形式说明,实现两

13、种用约定的某种形式说明,实现两种语言间的程序模块互相调用、变量语言间的程序模块互相调用、变量的相互传送以及参数和返回值的正的相互传送以及参数和返回值的正确使用确使用TurboC嵌入式汇编方式嵌入式汇编方式格式格式asm操作码操作码操作数操作数举例举例asmmovax,ds;asmpopax;asmpopds;asmret;asmpushds若干注意事项若干注意事项操作码支持操作码支持8086/8087指令或若干伪指指令或若干伪指令:令:db/dw/dd和和extern操作数是操作码可接受的数据:立即数、操作数是操作码可接受的数据:立即数、寄存器名,还可以是寄存器名,还可以是C语言程序中的常语言

14、程序中的常量、变量和标号等量、变量和标号等内嵌的汇编语句可以用分号内嵌的汇编语句可以用分号“;”结束,结束,也可以用换行符结束也可以用换行符结束使用使用C的注释,如的注释,如/*/正确运用通用寄存器、标号等正确运用通用寄存器、标号等/*LT702.C*/#include void upper(char*dest,char*src)asm mov si,src/*dest和和src是地址指针是地址指针*/asm mov di,destasm cldloop:asm lodsb/*C语言定义的标号语言定义的标号*/asm cmp al,aasm jb copy/*转移到转移到C的标号的标号*/as

15、m cmp al,zasm ja copy/*不是不是a到到z之间的字符原样复制之间的字符原样复制*/例7.21/2asm sub al,20h/*小写字母转换成大写小写字母转换成大写*/copy:asm stosbasm and al,al/*C语言中,字符串用语言中,字符串用NULL(0)结尾)结尾*/asm jnz loopmain()/*主程序主程序*/char str=This Started Out As Lowercase!;char chr100;upper(chr,str);printf(Origin string:n%sn,str);printf(Uppercase Str

16、ing:n%sn,chr);例7.22/2TurboC模块连接的约定规则模块连接的约定规则命名约定命名约定汇编语言过程应采用汇编语言过程应采用C语言类型语言类型声明约定声明约定C对调用的外部过程、变量等采用对调用的外部过程、变量等采用EXTERN说明说明汇编语言程序的标识符用汇编语言程序的标识符用public操作符定义操作符定义寄存器使用约定寄存器使用约定存储模式约定存储模式约定采用采用相同的存储模式相同的存储模式参数传递约定:堆栈和共享变量参数传递约定:堆栈和共享变量;汇编语言子程序:汇编语言子程序:lt703s.asm.model small,c;采用小型存储模式采用小型存储模式.data

17、msgdb Hello,C and Assembly!$.codePUBLIC displaydisplayproc;过程名加有下划线过程名加有下划线mov ah,9;小型模式不必设置小型模式不必设置DSmov dx,offset msg;寄存器寄存器AX和和DX无须保护无须保护int 21hretdisplayendpend例7.31/2/*C语言程序:语言程序:lt703.c*/extern void display(void);/*说明说明display是外部函数是外部函数*/main()display();利用汇编程序编译汇编语言程序成目标代码文件:利用汇编程序编译汇编语言程序成目标代

18、码文件:ML/clt703s.asm利用利用C编译程序编译编译程序编译C程序、连接目标代码文件:程序、连接目标代码文件:TCC-ms-Iinclude-Lliblt703.clt703s.obj例7.32/2;汇编语言子程序:汇编语言子程序: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;保存返回值保存返回值minexit:pop bpr

19、etminendpend例7.41/3图示large688L;汇编语言子程序:汇编语言子程序: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.42/3/*C语言程序:语言程序:lt704.c*/extern int min(int,int);main()printf(“%d”,min(100

20、,200);小型模式编译程序和连接:小型模式编译程序和连接:TCC-ms-Iinclude-Lliblt704.clt704s.obj大型模式编译程序和连接:大型模式编译程序和连接:TCC-ml-Iinclude-Lliblt704.clt704l.obj例7.43/3VisualC的嵌入式汇编的嵌入式汇编格式格式_asm指令指令举例举例intpower2(intnum,intpower)_asmmoveax,nummovecx,powershleax,cl/返回返回EAX=EAX(2CL)模块连接的注意事项模块连接的注意事项必须遵循共同的约定规则必须遵循共同的约定规则命名约定命名约定声明约定

21、声明约定寄存器使用约定寄存器使用约定存储模式约定存储模式约定参数传递约定参数传递约定采用一致的调用规范采用一致的调用规范声明共用函数和变量声明共用函数和变量正确传递入口参数和返回参数正确传递入口参数和返回参数32位汇编语言过程位汇编语言过程用用.386p等处理器伪指令说明采用的指等处理器伪指令说明采用的指令集令集32位逻辑段环境位逻辑段环境有些指令在有些指令在32位段与位段与16位段有差别位段有差别采用平展模式(采用平展模式(flat)汇编时采用选项汇编时采用选项/coff;汇编语言子程序:汇编语言子程序:lt714f.asm.386p.model flat,cPUBLIC power2.co

22、depower2 procpush ebpmov ebp,espmov eax,ebp+8;取第取第1个参数个参数mov ecx,bp+12;取第取第2个参数个参数shl eax,clpop ebpret;返回返回EAXpower2 endpend例7.141/3图示;汇编语言子程序:汇编语言子程序:lt714f.asm.386p.modelflat,cPUBLICpower2.codepower2PROC,num:dword,power:dwordmoveax,num;获取参数获取参数movecx,powershleax,cl;计算计算ret;EAX存放返回值存放返回值power2ENDPe

23、nd例7.142/3/C+语言程序:语言程序:lt714.cpp#include extern“c”int power2(int,int);void main(void)cout“2的的6次方乘次方乘5等于:等于:t”;coutpower2(5,6)endl;将汇编语言程序汇编成目标代码文件:将汇编语言程序汇编成目标代码文件:ML/c/cofflt714f.asm在在VisualC+6.0编译环境下创建项目,编译环境下创建项目,插入汇编成的目标代码文,然后编译连接插入汇编成的目标代码文,然后编译连接例7.143/3/C+程序:程序:LT715.CPP#include extern C long

24、 isum(int,int*);int imin(int,int*);void main(void)const int SIZE=10;int arraySIZE;int temp;cout请输入请输入10个整数:个整数:endl;for(temp=0;temparraytemp;coutendl;cout整数数据之和:整数数据之和:tisum(SIZE,array)endl;cout其中最小值为:其中最小值为:timin(SIZE,array)endl;例7.151/4/求求itmp个元素的数组个元素的数组iarray的最小数的最小数int imin(int itmp,int iarray)

25、_asm mov ecx,itmpjecxz minexit;个数为个数为0,返回,返回dec ecxmov esi,iarraymov eax,esijecxz minexit;个数为个数为1,返回,返回minlp:add esi,4cmp eax,esi;比较两个数据的大小比较两个数据的大小jle nochangemov eax,esi;取得较小值取得较小值nochange:loop minlpminexit:例7.152/4;汇编语言子程序:汇编语言子程序:LT715F.ASM.386p.model flat,c.code;32位有符号数据的求和过程位有符号数据的求和过程isum pro

26、c uses ecx esi,count:dword,darray:PTRmov ecx,count;个数为个数为0,和为,和为0 xor edx,edxxor eax,eaxjecxz sumexitmov esi,darray;个数为个数为1,和为本身,和为本身mov eax,esidec ecxjecxz sumexit例7.153/4sumlp:add esi,4add eax,esi;计算低计算低32位位adc edx,0;计算高计算高32位位loop sumlpsumexit:retisumendpend例7.154/4将汇编语言程序汇编成目标代码文件:将汇编语言程序汇编成目标代码

27、文件:ML/c/cofflt715f.asm在在VisualC+6.0编译环境下创建项目,编译环境下创建项目,插入汇编成的目标代码文件,然后编译连接插入汇编成的目标代码文件,然后编译连接汇编程序调用汇编程序调用C的函数的函数.386.modelflat,stdcalloptioncasemap:noneincludelibmsvcrt.libprintfPROTOC:ptrsbyte,:vararg.dataszMsgbytehelloworld!,0ah,0.codestart:invokeprintf,offsetszMsgretpublicstartendstart一个最简单的一个最简单

28、的Win32汇编语言程序汇编语言程序显示标准显示标准Windows消息窗口的程序消息窗口的程序消息框显示:消息框显示:欢迎进入欢迎进入32位位Windows世界世界!标题:标题:Win32示例示例Win32ASM程序结构程序结构.386.model flat,stdcalloption casemap:noneinclude masm32includewindows.incinclude masm32includekernel32.incinclude masm32includeuser32.incincludelib masm32libkernel32.libincludelib masm3

29、2libuser32.libltwin011/2API区别大小写区别大小写包含对系统常量和包含对系统常量和API函数等的声明函数等的声明包含包含API函数的库文件函数的库文件.dataszCaption db Win32示例示例,0szText db 欢迎进入欢迎进入32位位Windows世界!世界!,0.codestart:invoke MessageBox,NULL,addr szText,addr szCaption,MB_OKinvoke ExitProcess,NULLend startltwin012/2显示消息框显示消息框API调用调用返回操作系统返回操作系统API调用调用对比对

30、比C+程序程序创建一个窗口的过程创建一个窗口的过程1.取得程序的实例句柄(hInstance)2.注册窗口类,即为你的窗口指定处理消息的过程,定义光标,窗口风格,颜色等参数3.创建窗口4.显示窗口5.然后进入消息循环,也就是不停地检测有无消息,并把它发送给窗口进程去处理ltwin02.asmltwin02.exe窗口处理的过程窗口处理的过程1.从从Windows传给窗口过程的参数传给窗口过程的参数uMsg得到消得到消息类型,并转到不同的分支去处理息类型,并转到不同的分支去处理2.对已经处理的消息,返回对已经处理的消息,返回Windows时必须在时必须在eax中返回中返回03.不处理的消息,调用不处理的消息,调用DefWindowProc处理,处理,并把返回值传回并把返回值传回Windows;否则,;否则,Windows会无法显示会无法显示ltwin03.asmltwin03.exe

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服