总结generate_call_stub()现场保存和参数压栈

本文详细介绍了JVM在函数调用过程中如何进行现场保存,包括基地址和变址寄存器的处理,以及参数如何压栈。在函数调用前,JVM会保存调用者函数的现场,如CS:IP段寄存器、EDI、ESI和EBX寄存器的值,并将这些值压入被调用者函数的栈中。在参数压栈时,JVM遵循逆序压栈的规则,从调用者函数的栈顶开始将参数复制到被调用者函数的栈中,最后调用entry_point执行Java方法。
摘要由CSDN通过智能技术生成

     

目录

现场保存

基地址和变址寄存器

参数压栈

调用entry_point

接收返回值


      JVM完成对函数的入参空间计算后,接下来进行栈空间分配,具体的方式上一篇日志总结了,就是入参数量乘上当前操作系统环境指针的宽度,例如32位系统指针宽度为4个字节,64位宽度为8个字节,最后加上调用者函数现场保存过程中寄存器的值,即:

入参数量 * 4(或8)字节 + 4(假设有4个寄存器) * 4(或8)字节

      也就是说,调用函数总的方法栈空间,除了和入参数量,入参类型有关,还要加上一些寄存器的大小,方法栈内除了保存参数数据,还要保存某些寄存器的值,这些寄存器的作用不可忽视。

 

现场保存

      在方法栈空间分配完成后,执行具体的被调用函数指令前,还需要做一件事,那就是现场保存,JVM使用CS:IP段寄存器执行具体的函数机器指令,CS寄存器保存段地址,IP寄存器保存偏移地址,两者结合起来确定了待执行函数的首地址,所以发生函数调用时,CS:IP段寄存器会从调用者函数跳转到被调用者函数中,两个寄存器的值也会发生改变,CP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值