资源描述:
《汇编与C_C++的混合编程课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、汇编与C/C++的混合编程要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐应该采用过程调用伪指令INVOKE使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明过程声明和过程调用伪指令过程名PROC调用距离语言类型作用范围<起始参数>USES寄存器列表,参数:类型LOCAL参数表…;汇编语言语句过程名ENDP过程声明伪指令:用于事先声明过程的结构过程名PROTO调用距离语言类型,参数:类型过程调用伪指令INVOKE过程名,参数,...如何调用调用距离调用距离——可以是NEAR16、NEAR32、FAR
2、,表示该过程是近或远调用。简化段格式中,缺省值由.model语句选择的存储模式决定。语言类型语言类型——可以是任何有效的语言类型,确定该过程采用的命名约定和调用约定;语言类型还可以由.model伪指令指定语言类型CSYSCALLSTDCALLPASCALBASICFORTRAN命名约定名字前加下划线名字前加下划线名字变大写名字大写名字大写参数传递顺序从右到左从右到左(注)从左到右从左到右从左到右平衡堆栈的程序调用程序被调用程序被调用程序被调用程序被调用程序被调用程序保存BP是是是允许VARARG参数是是是作用范围作用范围——可以
3、是PUBLIC、PRIVATE、EXPORT,表示该过程是否对其他模块可见。缺省是PUBLIC,表示其他模块可见;PRIVATE表示对外不可见;EXPORT隐含有PUBLIC和FAR,表示该过程应该放置在导出表(exportentrytable)。起始参数起始参数——采用这个格式的PROC伪指令,汇编系统将自动创建过程的起始代码(Prologuecode)和收尾代码(Epiloguecode),用于传递堆栈参数以及清除堆栈等。起始参数表示传送给起始代码的参数;它必须使用尖括号“<>”括起来,多个参数用逗号分隔。寄存器列表寄存器列
4、表——指通用寄存器名,用空格分隔多个寄存器。只要利用“USES寄存器列表”罗列该过程中需要保存与恢复的寄存器,汇编系统将自动在起始代码产生相应的入栈指令,并对应在收尾代码产生出栈指令。参数参数∶类型——表示过程使用的形参及类型。在16位段中,缺省的类型是字WORD,在32位段中缺省的类型是双字DWORD。参数类型可以是任何MASM有效的类型或PTR(表示地址指针);在C、SYSCALL、STDCALL语言类型中。PROC伪指令中使用参数,必须定义语言类型。局部变量如果过程使用局部变量,紧接着过程定义伪指令PROC,可以采用一条或
5、多条LOCAL伪指令说明。其中,可选的“[个数]”表示同样类型数据的个数,类似数组元素的个数。在16位段中,缺省的类型是字WORD,在32位段中缺省的类型是双字DWORD。使用LOCAL伪指令说明局部变量后,汇编系统将自动利用堆栈存放该变量.例fig6-20new.asm此例该自fig6-20.asm,请注意比较。.386.MODELFLAT,stdcallExitProcessPROTONEAR32stdcall,dwExitCode:DWORDMovePROTONEAR32C,:WORD,:BYTE,:BYTE,:BYTEi
6、ncludeio.h;headerfileforinput/outputcrequ0dh;carriagereturncharacterLfequ0ah;linefeed.STACK4096;reserve4096-bytestack.DATA;reservestoragefordatapromptBYTEcr,Lf,'Howmanydisks?',0numberBYTE16DUP(?)countword?messageBYTEcr,Lf,'Movediskfromspindle'sourceBYTE?BYTE'tospindl
7、e'destBYTE?BYTE'.',0.CODEMovePROCNEAR32cuseseaxebx,countp:word,Sr:byte,Dst:byte,Spa:bytecmpcountp,1;NbrDisks=1?jneelseMore;skipifmorethan1movbx,wordptrSr;Sourcemovsource,bl;copycharactertooutputmovbx,wordptrDst;destinationmovdest,bl;copycharactertooutputoutputmessage
8、;printlinejmpendIfOne;returnelseMore:deccountpINVOKEMove,countp,Sr,Spa,DstINVOKEMove,1,Sr,Dst,SpaINVOKEMove,countp,Spa,Dst,SrendIfO