x86 和 arm 的函数调用规则

本文详细介绍了x86和ARM架构下的函数调用规则,包括寄存器使用、参数传递和返回值存储。在x86中,重点关注eax, ecx, edx, ebx和esp, ebp寄存器,而ARM则关注r0-r12及sp, lr, fp寄存器。函数调用时,x86会将参数压栈,然后跳转至被调用者,而ARM允许在寄存器和栈中传递参数。" 119853859,9064348,区块链中的哈希函数详解,"['区块链', '哈希算法', '算法']
摘要由CSDN通过智能技术生成

1. x86的函数调用规则

1.1 x86的寄存器说明

详细说明请参考:http://www.cnblogs.com/onroad/archive/2009/07/13/1522673.html

这里关心的只有:eax , ecx, edx,ebx四个数据寄存器和esp,ebp两个栈寄存器。

1.2 caller调用callee

首先会把参数压入到栈,第一个参数最后压入,所以在地址最低的位置。

然后返回地址压栈,jmp到callee的地址调用,这一步和call的作用相同。

进入到callee中,首先就是:

push ebp;原来的栈帧地址保存

mov ebp, esp;把ebp设置成现在的esp,所以返回地址在esp+4,第一个参数在esp+8,第二个参数在esp+12。。。

sub esp, xxx;esp栈顶下移一段,这段空间保存函数用到的局部变量等;

虽然有些局部变量保存在寄存器中,但对于要用到地址的局部变量就要保存在栈中,比如ebp-4 , ebp-8等。

push ebx;callee用到的寄存器都要先保存,但不需要eax,ecx,edx,这三个作为临时寄存器,callee可以随便用

最后恢复栈的原地址;

返回值放到eax,如果大于4字节可以用eax和edx,如果再大就放到栈中,caller会根据esp去取得;

ret;这条指令pop出返回地址然后跳转。</

函数调用是编程中的一个基本操作,它允许程序在不同的代码块之间进行切换,并传递参数和执行不同的任务。函数调用的底层实现原理涉及到许多复杂的计算机科学概念,包括内存管理、栈、寄存器、调用约定等。 在底层实现中,函数调用通常涉及以下几个步骤: 1. **参数传递**:当一个函数被调用时,它的参数会被压入调用函数的栈帧中。这些参数包括输入和输出参数,以及局部变量。 2. **代码执行**:当函数开始执行时,控制权会转移到该函数的代码上。这个过程通常涉及到将程序的执行上下文(包括寄存器的内容、内存中的数据等)保存到栈帧中,以便函数执行完毕后可以恢复这些信息。 3. **返回地址保存**:当函数执行完毕并准备返回时,它会将程序计数器的当前值(即下一条要执行的指令的地址)保存到一个特殊的寄存器(通常是EIP)中,以便函数可以返回调用它的代码。 4. **返回**:函数执行完毕后,会从栈帧中取出返回地址(通常是EIP),然后跳转到这个地址继续执行程序。此时,函数调用就完成了。 这个过程在许多不同的编程语言中都是相似的,但是实现方式可能会有所不同。具体实现会取决于所使用的编程语言和操作系统,以及硬件架构(如x86ARM等)。此外,不同的编译器和运行时环境可能会有不同的调用约定,这也会影响函数调用的底层实现。 值得注意的是,函数调用的底层实现通常涉及到许多底层的细节和复杂性,对于大多数编程任务来说并不需要了解这些细节。如果你对这方面的知识感兴趣,可以进一步学习计算机体系结构和操作系统课程,以了解更多关于函数调用和程序执行的基础知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值