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

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

ID:9045702

大小:20.19 KB

页数:8页

时间:2018-04-15

汇编语言的过程调用与c语言的函数调用_第1页
汇编语言的过程调用与c语言的函数调用_第2页
汇编语言的过程调用与c语言的函数调用_第3页
汇编语言的过程调用与c语言的函数调用_第4页
汇编语言的过程调用与c语言的函数调用_第5页
资源描述:

《汇编语言的过程调用与c语言的函数调用》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、汇编语言的过程调用与c语言的函数调用姓名:孙贵森学号:201212301118汇编语言的过程调用,如果需要传递参数,一般有2种方法,通过寄存器来“传递”,或是通过参数来传递。(还有将所有参数制成参数列表并压栈的传递方法,但较少用。)通过寄存器来“传递”,不是真正意义上的传递,其只不过是事先在几个有限的CPU寄存器中设置相应的值后,再调用过程,过程再直接读取这些寄存器的内容。可想而知,此法犹如C语言中的全局变量,极易感染。而如果通过参数来传递,又不得不面临手工维护堆栈框架(stackframe)的重担。堆栈框架动态地存放着参数、调用过程的返回地址、过程局部变量、过程内的压栈

2、等内容,也是不好对付的。一般情况下,一个普通的过程可能如下编写: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 m

3、ovebp,es subesp,8 ; ...... moveax,[ebp+12]; addeax,[ebp+8]; addeax,[ebp-4; addeax,[ebp-8]; ...... movesp,ebp; pope ret4*2;SumENDP在被调用的过程内,分为3种情况:1.无参数,也无局部变量2.有参数3.有局部变量当无参数且无局部变量时,堆栈中只是保存call语句的下一条语句的地址,可以很安全地返回。而当有参数,使用PROC伪指令的接收参数的形式,MASM则会自动生成正确的返回代码.而当有局部变量,使用LOCAL伪指令来定义局部变量,MASM也会自动

4、地生成正确的返回代码。在将参数压栈时,仍需将其打包为32位的,dataval1WORD19  ;.codemovzxeax,val1;pusheax    ;另一选择是,将用作argument的变量声明为DWORD..dataval1DWORD19;.codepushval1;还有另一种方法,即,总是传递指针。.dateval1WORD5val2WORD10val3WORDemainPROE pushOFFSETval2 pushOFFSETval1 callSum   ;sum(5,10) movval3,ax  ;receivethereturnvalueofSum 

5、exitmainENDPSumPROC, pV1:PTRWORD, pV2:PTRWORD, movesi,pV1 movax,wordptr[esi] movedi,pV2 addax,wordptr[edi] retSumENDP这种方法在保留了我们可以声明仅需的变量类型的同时,也确保argument32位的方法正确压栈。C语言中的每一个函数都是一个独立的代码块。一个函数的代码块是隐藏于函数内部的,不能被任何其它函数中的任何语句(除调用它的语句之外)所访问(例如,用goto语句跳转到另一个函数内部是不可能的)。构成一个函数体的代码对程序的其它部分来说是隐蔽的,它既不能

6、影响程序其它部分,也不受其它部分的影响。换言之,由于两个函数有不同的作用域,定义在一个函数内部的代码数据无法与定义在另一个函数内部的代码和数据相互作用。C语言中所有的函数都处于同一作用域级别上。这就是说,把一个函数定义于另一个函数内部是不可能的.量在函数内部定义的变量成为局部变量。在某些C语言教材中,局部变量称为自动变量,这就与使用可选关键字auto定义局部变量这一作法保持一致。局部变量仅由其被定义的模块内部的语句所访问。换言之,局部变量在自己的代码模块之外是不可知的。括号开始,以右花括号结束.对于局部变量,要了解的最重要的东西是:它们仅存在于被定义的当前执行代码块中,即

7、局部变量在进入模块时生成,在退出模块时消亡。定义局部变量的最常见的代码块是函数。例如,考虑下面两个函数.整数变量x被定义了两次,一次在func1()中,一次在func2()中。func1()和func2()中的x互不相关。其原因是每个x作为局部变量仅在被定义的块内可知。语言中包括了关键字auto,它可用于定义局部变量。但自从所有的非全局变量的缺省值假定为auto以来,auto就几乎很少使用了,因此在本书所有的例子中,均见不到这一关键字。在每一函数模块内的开始处定义所有需要的变量,是最常见的作法。这样做使得任何人读此函数时都很容

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。