汇编语言过程调用与c语言函数调用的异同
学号:姓名:
内容摘要:本文主要对基于Intel 80X86CPU系列的32位高级汇编语 言过程调用与基于C99标准的C语言函数调用进行比较。在程序设计 中,有类程序不能独立运行它们需要被另一个程序调用后才能运行, 汇编语言称这类程序为过程,对该类程序调用即称为过程调用。与之 相对应在高级语言C语言中对程序进行模块化设计而形成用函数完 成特定的功能的程序设计。汇编过程调用以堆栈结构为核心包括定 义、调用机制应用、变量访问等关键行为。在C语言中则包括定义、 参数定义、数据传递等。
关键词:函数、过程、数据传递、堆栈
过程定义与函数定义的异同
过程定义与函数定义的异同
相同点:
都遵循先定义后使用的规则,并且要指定过程的名字和函数的名字以 便以后按名调用。
一般来说汇编语言的过程调用和C函数调用(该函数不是Void类型) 在过程和函数中至少有一个返回指令。
过程名和函数名的取名都按标识符取名规则取名。
都可定义有参过程或函数,过程或函数体包括声明部分和语句部分。 5?汇编语言可以定义空过程,C函数可以定义空函数。
不同点:
( 1)汇编过程定义
过程名 PROC [NEAR/FAR]
过程名 ENDP
(一)过程的框架结构
procedure 过程名;@noframe;
局部静态变量定义
begin过程名;
push(ebp); mov(esp,ebp);
为局部自动变量分配内存 保护寄存器 指令序列… 恢复寄存器
mov(ebp,esp); pop(ebp);
ret( [N]);
201泗27 Th剖M过程名;744
(2) C函数定义
类型名 函数名(形式参数列表)
{
函数体
}
过程定义是要用到@noframe,该单词让程序员在过程里建立用普通指 令访问堆栈的指针EBP,为自动局部变量分配堆栈空间、过程结束时撤 销用普通指令访问堆栈的指针、冋收自动变量和形参占用的堆栈空间, 用正确的RET指令返回调用程序。而函数调用不会用到该单词1。
3 ?形参定义格式不同:
汇编语言过程中形参的定义
过程名(形参表)
War]形参名:类型标识符
C语言函数
类型名函数名(类型:变量名,?……)
二、过程调用与函数调用的形式的异同
相同点:
最终都是通过调用栈来实现过程和函数的调用。
两者都可以进行嵌套调用和递归调用。
不同点:
格式不同:
汇编调用过程指令格式
Call 过程名
C函数调用语句
把函数调用单独作为一个语句。例如:printf_star();
2?在调用有参数过程吋,调用程序在call指令之前必须蒋实参值或实 参的地址压入堆栈。
?调用
调用过程前堆 栈的内容
调用过程前堆 栈的内容
形羞变里区
返回地址
旧EBP值
局部自动变里 区
保护寄存器 状态区
ESP
ESP
ESP
ESP
ESP
图 12.22
ESP
让栈顶指针逐步 向高地址方向移 动。
4 ?移过保护寄存器 状态区
移过局部自动变 量区
恢复EBP
将返回地峻入
EIP
移过形参变量区
2013^27 Thursday
过程调用与函数调用的数据传递的异同
相同点:
都包括值传递和引用传递的形式
形参都可以从实参得到一个值。
主函数可以调用其他的函数,但其他的函数不能调用主函数。在主函 数前用函数不需要申明,在主函数后用需要申明。
不同点:
1 ?汇编过程调用吋可以直接利用CPU的通用寄存器资源,在过程调用前的 机器状态和过程返回后的机器状态一致,所以要保护寄存器。
汇编过程执行时要先把原来的基地址寄存器ebp值入栈,因为在程序执 行中ebp要另作他用,可以由此寻址获得函数参数。
C语言函数调用与之相比具有一下区别:C语言中函数访问参数的方法 就是先通过”PUSH BP”保存BP/'MOV BP,SP“把当前的堆栈指针传递给BP.第一个参 数的地址就在BP+4,第二个参数的地址就在BP+6,...比如“MOV AX, WO RD PTR[BP+4]“就可以把第一个参数值传给AX寄存器.而需要留意的是C传递参数的 顺序是和其它语言和反的.C语言是把参数的地址从右到左压入堆栈,所以越后面 的参数,在堆栈中的地址越靠前/
四、过程调用与函数调用的步骤的异同
1、在定义过程和函数屮指定的形参在未出现调用时它们并不占用存储单 元,在发生调用时它们的形参被临时分配存储单元。在汇编语言中调用一个过 程发生在寄存器中,主过程需要和子过程建立传递结构。调用程序首先把实参 值或实参的地址压入堆栈,执行CALL指令把返回地址压入堆栈。调用程序构建 传递结构的使命结束,接着将ESP的值复制给EBP,从此EBP代表传递结构的 基址然后为局部变量分配内存空间,最后保护机器状态。此后还需要清除传递 结构。
在C语言屮则主要是在内存屮