首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏技术趋势

    深入

    每个方法被执行的时候,java虚拟机都会同步创建一个的基本单位为,每个线程都有自已的,每个执行方法对应一个,也叫当前。 每一个都包括了局部变量表,操作数,动态连接,方法返回地址和一些额外的附加信息。 的特点就是后进先出,类似于坐电梯,后面进来的先出去。 特点: 局部变量的生命周期与一致:随着方法的销毁,局部变量随着销毁。 注: 操作数最大深度不会超过:max_stacks数据项中设定的最大值 byte、short和char类型在入前会被转成int类型; 虽然两个不同是相互独立的但是,为了节约一些空间,对进行了优化 注意:若调用方法返回的时候带了返回值,其返回会被压入当前的操作数中,并更新PC寄存器中一条需要执行的字节码指令。

    1.1K10发布于 2021-04-13
  • 来自专栏无题~

    概念结构

    是用于支持虚拟机进行方法调用和方法执行背后的数据结构。存储了方法的局部变量表、操作数、动态连接和方法返回地址信息。 操作数 操作数,也称操作,是一个后入先出。 当一个方法刚刚开始执行的时候, 该方法的操作数也是空的, 在方法的执行过程中, 会有各种字节码指令往操作数中写入和提取内容, 也就是出与入操作。 动态连接 每个都包含一个指向运行时常量池中该所属方法的引用, 持有引用是为了支持方法调用过程中的动态连接(Dynamic Linking)。

    59520发布于 2020-05-08
  • 来自专栏计算机视觉理论及其实现

    指针&& 指针详解

    单个函数调用操作所使用的部分被称为(stack frame)结构,其一般结构如下图所示。结构的两端由两个指针来指定。 在函数执行过程中,指针esp会随着数据的入和出而移动,因此函数中对大部分数据的访问都基于指针%ebp进行。?对于函数A调用函数B的情况,传递给B的参数包含在A的中。 当A调用B时,函数A的返回地址(调用返回后继续执行的指令地址)被压入中,中该位置也明确指明了A的结束处。而B的则从随后的部分开始,即图中保存指针(ebp)的地方开始。 这两个函数的结构如图3-5所示。可以看出,函数swap()从调用者main()的中获取其参数。图中的位置信息相对于寄存器ebp中的指针。左边的数字指出了相对于指针的地址偏移值。 前两行用来设置保存调用者的指针和设置本函数的指针,第5行通过把指针esp下移4字节为局部变量c分配空间。6~15行是swap函数的主体部分。

    10.1K31编辑于 2022-09-03
  • 图文解析函数

    一、函数是什么? 在程序运行过程中,函数(Function Stack Frame) 是内存中为单个函数调用分配的一块独立内存区域。 其中放入乒乓球被称为压(push)  其中拿出乒乓球被称为出(pop) 1.压 2.出 3.维护的指针(两个寄存器) ①EBP(底指针):固定指向当前的 “基地址”,用于定位内的参数 ,变量b后压入中,此时esp顶指针指向下一个即将压入中元素的位置,ebp维护的是main函数中的基底位置。 四、总结:  函数的核心要点:   ①创建:调用者压参数→压返回地址→被调用者压旧 EBP→设新 EBP→分配局部变量。 ②使用:通过 EBP 的固定偏移访问参数(EBP+偏移)和局部变量(EBP-偏移)。 ③销毁:释放局部变量→恢复旧 EBP→弹出返回地址→清理参数→回到调用者。  

    49620编辑于 2025-12-24
  • 来自专栏跟我一起学编程

    函数(超详细)

    提示:以下是本篇文章正文内容,下面案例可供参考 一、函数 1.1函数的概念 函数是指在函数被调用时,系统为该函数在(Stack)区域中开辟的一段存储空间。 1.2函数的作用 函数是程序执行过程中用来进行内存管理的必备工具。当函数被调用时,系统为该函数分配空间,将函数的返回地址、指针、局部变量、参数等信息保存在中。 2.1减少的大小 由于函数的大小直接影响程序内存的使用效率,因此我们可以通过一些优化手段减少的大小,从而提升程序的性能。 减少的深度 由于的深度直接影响的大小和内存的使用效率,因此我们可以通过减少的深度来提升程序的性能。 三、函数的调试与问题排查 调试和排查函数相关的问题是在开发过程中常见的任务。

    1.3K10编辑于 2024-03-21
  • 来自专栏分享技术

    什么是虚拟机_

    一般来讲,之间都是独立的,但是大多虚拟机都会做优化,使局部变量表和操作数之间有重叠,以达到共用的目的,这样能节省额外的参数复制等工作,重叠过程类似下图。 动态连接每个都包含一个指向运行时常量池中该所属方法的引用,Class 文件的常量池中存有大量的符号引用。字节码中的方法调用指令就以常量池中方法的符号引用为参数。 方法返回时可能会在中保存一些信息,用来恢复上层方法的执行状态。一般方法正常退出的时候,调用者的pc计数器的值可以作为返回地址,中很有可能会保存这个计数器的值作为返回地址。 方法退出的过程就是在虚拟机上的出过程,因此退出时的操作可能有:恢复上层方法的局部变量表和操作数,把返回值压入调用者的操作数每条整pc计数器的值指向调用该方法的后一条指令。 如果异常退出的话,返回地址是通过异常表来确定,中一般不会保存这部分信息。这两个出口的区别就在于,异常完成出口退出是不会给上一层调用者产生任何返回值的。

    29900编辑于 2023-11-21
  • 来自专栏C++核心编程

    CCPP函数括号{} | | 堆栈 | 变量

    ,至此main函数的保护工作完成,然后通过mov指令更新基准线,与顶水位线齐平。 至此红蓝两条线都恢复到了最开始的位置,main函数在恢复完成。 不准确的说,函数的就是红蓝两条线之间的内存块,它用来存放函数的临时变量,参数和返回地址。 所谓的保护恢复,不过是在保存和恢复寄存器esp和ebp的值。 至于return address是用来做:函数返回的。 随着函数的调用,函数的会逐层堆叠,但互不重合。 随着函数的逐层返回函数的会被就地放弃,但不会清理内存。 2 正括号{用来保护上层主调函数(main)的,并设置被调函数(func)的,反括号}用来放弃被调函数的,同时恢复主调函数的,这样被调函数执行完后,主调函数就能正常执行。

    95110编辑于 2022-10-04
  • 来自专栏CTF新手教程

    PWN从入门到放弃(3)——&

    其中 ESP:堆栈指针寄存器,存放执行函数对应顶地址,且始终指向顶。 EBP:基址指针寄存器,存放执行函数对应底地址,用于 C 运行库访问中的局部变量和参数。 0x02 函数调用经常是嵌套的,在同一时刻,堆栈中会有多个函数的信息。每个未完成运行的函数占用一个独立的连续区域,称作 (Stack Frame)。 是堆栈的逻辑片段,当调用函数时逻辑被压入堆栈, 当函数返回时逻辑被从堆栈中弹出。存放着函数参数,局部变量及恢复前一所需要的数据等。 的边界由基地址指针 EBP 和堆栈指针 ESP 界定 (指针存放在相应寄存器中)。 EBP 指向当前底部 (高地址),在当前内位置固定;ESP 指向当前顶部 (低地址),当程序执行时 ESP 会随着数据的入和出而移动。

    1.1K10编辑于 2024-01-30
  • 来自专栏k8s快速入门

    函数调用过程()

    开发环境 Ubuntu 14.04(32bits) GCC 编辑器 Cmd Markdown 画图工具 Processon 1,函数调用过程 今天先介绍下基本的函数调用过程,即。 1.1 每个函数调用都对应一个。每个由ESP和EBP寄存器来确定。每个函数执行时,其局部变量都是在自己对应的内分配内存。 -main .globl test .type test, @function test: .LFB1: .cfi_startproc pushl %ebp //ebp压,即old ebp ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2" .section .note.GNU-stack,"",@progbits 当main函数调用test函数时,对应的见下图 当函数test返回后,main函数的如下图

    1.2K20编辑于 2022-04-25
  • 来自专栏Android点滴分享

    汇编学习(5),函数,

    本篇介绍 本篇介绍下汇编中的函数,内容。 对于intel处理器,在调用函数的时候需要保证rsp是16字节对齐的,这样设计是为了更好的支持SIMD。那体现到代码上是怎样呢? 本来在调用main函数之前rsp是16字节对齐的,可是在调用main时候,由于会将返回地址压,这时候rsp就不是16字节对齐了,就需要prologue中再次执行一个进操作,就可以保证是对齐的了。

    70810编辑于 2022-12-07
  • 来自专栏龙首琴剑庐

    理解 JVM Stack Frame

    前置知识 JVM运行时数据区 的组成 虚拟机 虚拟机(JVM Stack),由 Frame 组成。 Frame - 每个方法对应一个, 包括以下部分: Local Variable Table (局部变量表) ? return address(返回地址) a() -> b(),方法a调用了方法b, b方法的返回值放在什么地方 方法退出时会做的操作: 恢复上一个方法(调用者的)的Local Variable Table(局部变量表)和Operand Stack(操作数) 将返回的变量压入 上一个方法(调用者的)的Operand Stack(操作数) 调整 Program Counter Register (PC, 程序计数器) 的值为 当前的返回地址 当前弹出JVM Stack , 执行Program Counter Register (PC, 程序计数器)指向的指令 理解JVM 用两个代码来帮助理解

    96520发布于 2020-04-24
  • 来自专栏运维开发王义杰

    Go: 深入理解程序调用

    这些信息保存在中,并且被压入调用。 什么是是调用中的基本单元,每个函数调用都会在调用中创建一个新的保存了函数执行所需的所有信息,包括局部变量、返回地址、参数等。 函数调用过程 当程序执行到 main 函数时,会首先在调用中创建一个以保存 main 函数的执行状态。然后,main 函数调用 A 函数,系统会在调用中为 A 函数创建一个新的。 随着 A 函数调用 B 函数,调用中会继续创建新的。最终,B 函数调用 C 函数,调用中创建了 C 函数的。 2. 调用示意图 为了更直观地展示上述过程,我们可以使用 UML 创建一个调用的示意图: 在错误处理中的应用 在错误处理和调试过程中也非常有用。 结论 程序调用是理解程序执行原理的重要概念。调用管理函数调用的顺序,而则保存每个函数调用的详细信息。通过掌握这些概念,开发者可以更好地进行调试、错误处理和性能优化。

    52110编辑于 2024-05-29
  • 来自专栏《数据结构》

    函数的创建和销毁

    ---- 1.什么是函数 函数( stack frame )就是函数调用过程中在程序的调用( call stack )所开辟的空间,这些空间是用来存放: 函数参数和函数返回值 3.函数的创建和销毁解析 3.1 ( stack )是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了,没有就没有函数,没有局部变量,也就没有我们如今看到的所有的计算机语言。 转入目标函数 jump :通过修改 eip ,转入目标函数,进行调用 ret :恢复返回地址,压入 eip ,类似 pop eip 命令 3.3解析函数的创建和销毁 3.3.1  基本知识 1.每一次函数调用,都要为本次函数调用开辟空间,就是函数的空间。 2.这块空间的维护是使用了两个寄存器:esp ebp,ebp记录的是底的地址,esp记录的是顶的地址。 3.函数的创建和销毁过程,在不同的编译器上实现的方法大同小异。

    1.3K20编辑于 2023-04-16
  • 来自专栏跟我一起学编程

    函数的创建和销毁

    提示:以下是本篇文章正文内容,下面案例可供参考 一、函数的创建 函数的创建是在函数调用时进行的,中包含了局部变量、函数参数、返回地址和调用者的上下文等信息。具体的创建过程如下: 1. 函数参数的传递 在函数调用时,参数的值会被压入中,这些参数会成为新的一部分。在中,函数参数的位置是从高地址到低地址分配的。 2. 二、函数的销毁 函数的销毁是在函数返回时进行的。在函数返回之前,需要将中的信息恢复并将其从中弹出。具体的销毁过程如下: 1. 减小指针 在完成上述过程后,需要将指针(P)向下移动,以便将当前中弹出。当指针恢复到上一个的位置时,程序会从该处继续执行,直到遇到下一个函数调用。 的大小限制: 的大小是由局部变量、函数参数和其他信息所占用的内存大小决定的。在设计函数时,我们应该合理估计局部变量的大小和数量,避免过大导致溢出。

    56210编辑于 2024-03-21
  • 来自专栏C语言讲解

    函数的创建和销毁

    那么通过学习函数的创建和销毁,以上困惑就会迎刃而解。 注: 本次讲解使用的是vs2013,不要使用太高级的编译器,越高级的编译器,越不容易学习和观察;同时,在不同的编译器下,函数调用过程中的创建是略有差异的,具体细节取决于编译器的实现。 为了讲清楚函数,我们需要先做一些铺垫: 寄存器: eax ebx ecx edx ebp esp ebp、esp这2个寄存器中存放的是地址,这2个地址是用来维护函数的 每一个函数调用,都要在区创建一个空间 接下来,就正式开始介绍函数的创建和销毁 push ebp mov ebp,esp sub esp,0E4h push ebx push esi push 总结: 局部变量在函数的里被分配了一些空间进行创建 局部变量不初始化的时候是随机值(比如上述过程中不初始化之前是cccccccc) 函数在调用之前就把参数从右向左进行压;真正进入函数后通过指针的偏移量找到形参

    52510编辑于 2024-01-22
  • 来自专栏C/C++爱好者

    函数的创建和销毁

    ---- 函数的创建和销毁::   ebp,esp这两个寄存器中存放的是地址,这两个地址是用来维护函数的,edp被称为底指针,esp被称为顶指针。push:压:给顶放一个元素。 pop:出:给顶删一个元素,lea:加载有效地址。dword=4byte。 答:首先为此次函数调用创建函数,在函数找空间存放局部变量值。 2.为什么局部变量的值是随机值? 随机值是系统开辟完函数后系统随机放进去的。 3.函数是怎么传参的? 返回值并不会随着函数作用域的销毁而销毁,而是放在eax中准备返回,当通过pop出回到main函数中再将返回值放到局部变量中。

    94630编辑于 2023-04-12
  • 来自专栏C语言与数据结构算法

    云边诗亭——函数

    函数的创建和销毁 函数的介绍 函数是计算机程序运行时在调用(Call Stack)上为每个函数调用分配的一块内存区域,用于存储该函数执行所需的各种信息。 的关键寄存器 在x86架构中,有两个关键寄存器与相关: ESP (Extended Stack Pointer):指向顶(当前可用的最低地址) EBP (Extended Base Pointer ):指向当前的基址 VS中的调用堆栈 的基本结构 一个典型的函数包含以下几个主要部分(从高地址向低地址生长): 函数参数:调用者传递给被调用函数的参数 返回地址:函数执行完毕后应该返回的指令地址 前一个的基址(EBP/RBP):保存调用者的基址 局部变量:函数内部定义的变量 临时空间:用于表达式计算等临时存储 的重要性 实现函数调用和返回:保证程序能正确地在函数间跳转和返回 隔离函数状态:每个函数有自己的,互不干扰 支持递归调用:每次递归调用都会创建新的 调试信息:包含调试器回溯调用链所需的信息 作者寄语 对于函数,我们只需了解一些运行原理即可

    22010编辑于 2025-11-18
  • 来自专栏用户9199536的专栏

    C++|Compiler|活动记录(

    活动记录(Activation Record),常称(stack frame)。 ---- 嵌套过程 静态链(Static Link) 嵌套函数中,内部函数调用的可见外部函数调用的中的变量。 以frame pointer作为第一个参数(不一定是当前的,而是callee的上层)传递给callee作为static link,可以通过static link回溯上一层、上上层的,最终获得外部的变量 如果儿子1调用儿子2,那么事实上儿子1是通过父亲访问到的儿子2,因此不能直接传儿子1的,而是先回溯到父亲的,再把父亲的指针作为第一个参数传递给儿子2. F_allocLocal在上分配局部变量。

    1.7K40发布于 2021-11-22
  • 函数的创建与销毁

    这些都与函数的有关系。 那么就让我们一起走进函数的创建与销毁的过程中。 3:函数的创建与销毁的解析 在解析函数的创建与销毁之前,首先呢得了解一些预备知识,这样子方便后续的理解。 esp与底指针ebp所维护的空间就是为main函数所开辟的函数,所对应的函数图如下。 sub前 sub后 通过过对比sub前与sub后,我们会发现此时esp和ebp不再维护main函数的函数,而是维护了一块新的,我们之前说过,函数每次调用都会在区上开辟一块属于自己的函数, 那么此时顶指针esp与底指针ebp所维护的空间就是为Add函数所开辟的函数,所对应的函数图如下。

    10510编辑于 2026-01-12
  • 来自专栏C/C++学习

    函数的创建与销毁

    一、预备知识 在正式了解函数以前,我们需要先了解一些预备知识。 大致分布如图: 我们本次所要了解的属于区。 2.简介 也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。 函数的每次调用,都有它自己独立的。 二、函数介绍 每个函数被调用时都会建立,在接下来的调试过程中我将会进一步解释。 3.函数的创建与销毁(重点) 该程序的汇编代码如下:(注释有每一步的原理) --- d:\c语言\函数hszz\函数hszz\hszz.c -------------------------

    97120编辑于 2023-04-28
领券