文档详情

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

发布:2017-05-16约4千字共8页下载文档
文本预览下载声明
汇编语言的过程调用与c语言的函数调用姓名:孙贵森学号:201212301118汇编语言的过程调用,如果需要传递参数,一般有2种方法,通过寄存器来“传递”,或是通过参数来传递。(还有将所有参数制成参数列表并压栈的传递方法,但较少用。)通过寄存器来“传递”,不是真正意义上的传递,其只不过是事先在几个有限的CPU寄存器中设置相应的值后,再调用过程,过程再直接读取这些寄存器的内容。可想而知,此法犹如C语言中的全局变量,极易感染。而如果通过参数来传递,又不得不面临手工维护堆栈框架(stack frame)的重担。堆栈框架动态地存放着参数、调用过程的返回地址、过程局部变量、过程内的压栈等内容,也是不好对付的。一般情况下,一个普通的过程可能如下编写: Sum PROC? push ebp? mov ebp, esp? .....? pop ebp? retSum ENDP作为遵从C调用约定(Calling Convention)调用者,则需这样调用上述过程:push 5?; push 8; call Sum ; add esp, 4 * 2; 而如果遵从STDCALL调用约定,则:Sum PROC? push ebp? mov ebp, esp? ......? mov eax, [ebp + 12] ;? add eax, [ebp + 8];? ......? pop ebp? ret 4 * 2?; Sum ENDPSum PROC? push ebp? mov ebp, es? sub esp, 8?;? ......? mov eax, [ebp + 12];? add eax, [ebp + 8];? add eax, [ebp - 4;? add eax, [ebp - 8];? ......? mov esp, ebp;? pop e? ret 4 * 2; Sum ENDP在被调用的过程内,分为3种情况: 1. 无参数,也无局部变量2. 有参数3. 有局部变量当无参数且无局部变量时,堆栈中只是保存call语句的下一条语句的地址,可以很安全地返回。而当有参数,使用PROC伪指令的接收参数的形式,MASM则会自动生成正确的返回代码.而当有局部变量,使用LOCAL伪指令来定义局部变量,MASM也会自动地生成正确的返回代码。在将参数压栈时,仍需将其打包为32位的,dataval1 WORD 19??;.codemovzx eax, val1 ; push eax????; 另一选择是,将用作argument的变量声明为DWORD..dataval1 DWORD 19;.codepush val1 ;还有另一种方法,即,总是传递指针。.dateval1 WORD 5val2 WORD 10val3 WORDemain PROE?push OFFSET val2?push OFFSET val1?call Sum??? ; sum(5, 10)?mov val3, ax?? ; receive the return value of Sum?exitmain ENDPSum PROC,?pV1:PTR WORD,?pV2:PTR WORD,?mov esi, pV1?mov ax, word ptr [esi]?mov edi, pV2?add ax, word ptr [edi]?retSum ENDP这种方法在保留了我们可以声明仅需的变量类型的同时,也确保argument32位的方法正确压栈。C语言中的每一个函数都是一个独立的代码块。一个函数的代码块是隐藏于函数内部的,不能被任何其它函数中的任何语句(除调用它的语句之外)所访问(例如,用g o t o语句跳转到另一个函数内部是不可能的)。构成一个函数体的代码对程序的其它部分来说是隐蔽的,它既不能影响程序其它部分,也不受其它部分的影响。换言之,由于两个函数有不同的作用域,定义在一个函数内部的代码数据无法与定义在另一个函数内部的代码和数据相互作用。C语言中所有的函数都处于同一作用域级别上。这就是说,把一个函数定义于另一个函数内部是不可能的.量在函数内部定义的变量成为局部变量。在某些C语言教材中,局部变量称为自动变量,这就与使用可选关键字a u t o定义局部变量这一作法保持一致。局部变量仅由其被定义的模块内部的语句所访问。换言之,局部变量在自己的代码模块之外是不可知的。括号开始,以右花括号结束.对于局部变量,要了解的最重要的东西是:它们仅存在于被定义的当前执行代码块中,即局部变量在进入模块时生成,在退出模块时消亡。定义局部变量的最常见的代码块是函数。例如,考虑下面两个函数.整数变量x被定义了两次,一次在func1()中,一次在func2()中。func1()和func2
显示全部
相似文档