1 / 8
文档名称:

汇编语言的过程调用与c语言的函数调用.docx

格式:docx   大小:17KB   页数:8页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

汇编语言的过程调用与c语言的函数调用.docx

上传人:花开一叶 2019/3/5 文件大小:17 KB

下载得到文件列表

汇编语言的过程调用与c语言的函数调用.docx

相关文档

文档介绍

文档介绍:汇编语言的过程调用与c语言的函数调用姓名:孙贵森学号:1118汇编语言的过程调用,如果需要传递参数,一般有2种方法,通过寄存器来“传递”,或是通过参数来传递。(还有将所有参数制成参数列表并压栈的传递方法,但较少用。)通过寄存器来“传递”,不是真正意义上的传递,其只不过是事先在几个有限的CPU寄存器中设置相应的值后,再调用过程,过程再直接读取这些寄存器的内容。可想而知,此法犹如C语言中的全局变量,极易感染。而如果通过参数来传递,又不得不面临手工维护堆栈框架(stackframe)的重担。堆栈框架动态地存放着参数、调用过程的返回地址、过程局部变量、过程内的压栈等内容,也是不好对付的。一般情况下,一个普通的过程可能如下编写:SumPROC pushebp movebp,esp ..... popebp retSumENDP作为遵从C调用约定(CallingConvention)调用者,则需这样调用上述过程:push5 ;push8;callSum;addesp,4*2;而如果遵从STDCALL调用约定,则:SumPROC pushebp movebp,esp ...... moveax,[ebp+12]; addeax,[ebp+8]; ...... popebp ret4*2 ;SumENDPSumPROC pushebp movebp,es subesp,8 ; ...... moveax,[ebp+12]; addeax,[ebp+8]; addeax,[ebp-4; addeax,[ebp-8]; ...... movesp,ebp; pope ret4*2;SumENDP在被调用的过程内,分为3种情况:,,堆栈中只是保存call语句的下一条语句的地址,可以很安全地返回。而当有参数,使用PROC伪指令的接收参数的形式,,使用LOCAL伪指令来定义局部变量,MASM也会自动地生成正确的返回代码。在将参数压栈时,仍需将其打包为32位的,dataval1WORD19  ;.codemovzxeax,val1;pusheax    ;另一选择是,将用作argument的变量声明为DWORD..dataval1DWORD19;.codepushval1;还有另一种方法,即,总是传递指针。.dateval1WORD5val2WORD10val3WORDemainPROE pushOFFSETval2 pushOFFSETval1 callSum   ;sum(5,10) movval3,ax  ;receivethereturnvalueofSum exitmainENDPSumPROC, pV1:PTRWORD, pV2:PTRWORD, movesi,pV1 movax,wordptr[esi] movedi,pV2 addax,wordptr[edi] retSumENDP这种方法在保留了我们可以声明仅需的变量类型的同时,也确保argument32位的方法正确压栈。C语言中的每一个函数都是一个独立的代码块。一个函数的代码块是隐藏于函数内部的,不能被任何其它函数中的任何语句(除调用它的语句之外)所访问(例如,用goto语句跳转到另一个函数内