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

    深入

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

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

    概念结构

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

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

    指针&& 指针详解

    .调用者的返回地址入,这个是用 前指令地址++ 作返回地址的3.调用者的指针入保护(本次调用的基址指针就指向这里)4.调用者的寄存器入保护5.被调用的函数的局部变量的分配依cpu不同会有细小的差别函数调用时的内存布局 例如,-4被表示成0xFFFFFFFC,-12会被表示成0xFFFFFFF4。调用者main()的结构中包括局部变量a和b的存储空间,相对于指针位于-4和-8偏移处。 是把esp指向的地址赋值给%ebp,%ebp作为新:_swap底指针或者说是新指针ebp使用)5 subl $4,%esp # 为局部变量c在内分配空间。 (执行此指令后,指针esp的指向由原来的-8%ebp指向 //了-12%ebp处,保存了第2个参数&b)26 leal -4(%ebp),%eax # 再取局部变量a的地址,作为第1个参数入。 前两行用来设置保存调用者的指针和设置本函数的指针,第5行通过把指针esp下移4字节为局部变量c分配空间。6~15行是swap函数的主体部分。

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

    一、函数是什么? 在程序运行过程中,函数(Function Stack Frame) 是内存中为单个函数调用分配的一块独立内存区域。 其中放入乒乓球被称为压(push)  其中拿出乒乓球被称为出(pop) 1.压 2.出 3.维护的指针(两个寄存器) ①EBP(底指针):固定指向当前的 “基地址”,用于定位内的参数 4.CPU 的EAX寄存器 主要作用就是传递函数返回值      三、案例代码详解函数         代码示例:主函数中调用add函数,实现x+y #include <stdio.h> / 步骤 2.1:压入 add 的第二个参数  如下图所示: 执行 push 3(将b的值压) ESP 向下移动 4 字节(int 占 4 字节),指向新顶 步骤 2.2:压入 add 的第一个参数 步骤 3.1:保存 main 的 EBP 如图所示: 为了 add 执行完后能恢复 main 的,需要先把 main 的 EBP压; 执行 push ebp; ESP 向下移动 4 字节。

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

    函数(超详细)

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

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

    什么是虚拟机_

    这个区域,以 Slot 为最小单位,32 位虚拟机,一个 slot 可以放 32 位(4字节)以内的数据。 一般来讲,之间都是独立的,但是大多虚拟机都会做优化,使局部变量表和操作数之间有重叠,以达到共用的目的,这样能节省额外的参数复制等工作,重叠过程类似下图。 动态连接每个都包含一个指向运行时常量池中该所属方法的引用,Class 文件的常量池中存有大量的符号引用。字节码中的方法调用指令就以常量池中方法的符号引用为参数。 方法返回时可能会在中保存一些信息,用来恢复上层方法的执行状态。一般方法正常退出的时候,调用者的pc计数器的值可以作为返回地址,中很有可能会保存这个计数器的值作为返回地址。 方法退出的过程就是在虚拟机上的出过程,因此退出时的操作可能有:恢复上层方法的局部变量表和操作数,把返回值压入调用者的操作数每条整pc计数器的值指向调用该方法的后一条指令。

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

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

    ,至此main函数的保护工作完成,然后通过mov指令更新基准线,与顶水位线齐平。 然后通过sub指令把红色水位线提升8个字节,用来给两个临时变量分配:堆栈内存 之后就是对临时变量ab赋值,可见ab相对于蓝色基准线的偏移分别是4和8,刚好用完函数的。 随着函数的调用,函数的会逐层堆叠,但互不重合。 随着函数的逐层返回函数的会被就地放弃,但不会清理内存。 2 正括号{用来保护上层主调函数(main)的,并设置被调函数(func)的,反括号}用来放弃被调函数的,同时恢复主调函数的,这样被调函数执行完后,主调函数就能正常执行。 4 不同编译器对的实现方法略有不同,但思路一致。

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

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

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

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

    函数调用过程()

    开发环境 Ubuntu 14.04(32bits) GCC 编辑器 Cmd Markdown 画图工具 Processon 1,函数调用过程 今天先介绍下基本的函数调用过程,即。 1.1 每个函数调用都对应一个。每个由ESP和EBP寄存器来确定。每个函数执行时,其局部变量都是在自己对应的内分配内存。 24即局部变量j的地址 movl 24(%esp), %eax //将j变量的值赋给eax寄存器 movl %eax, 4(%esp) //j为test函数的实参,此处将j的值压 movl 20 ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2" .section .note.GNU-stack,"",@progbits 当main函数调用test函数时,对应的见下图 当函数test返回后,main函数的如下图

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

    汇编学习(5),函数,

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

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

    理解 JVM Stack Frame

    前置知识 JVM运行时数据区 的组成 虚拟机 虚拟机(JVM Stack),由 Frame 组成。 Frame - 每个方法对应一个, 包括以下部分: Local Variable Table (局部变量表) ? Table(局部变量表)和Operand Stack(操作数) 将返回的变量压入 上一个方法(调用者的)的Operand Stack(操作数) 调整 Program Counter Register (PC, 程序计数器) 的值为 当前的返回地址 当前弹出JVM Stack , 执行Program Counter Register (PC, 程序计数器)指向的指令 理解JVM 用两个代码来帮助理解 4 iinc 1 by 1 --> 完成 i++ ? 7 istore_1 --> i = i++; ? i = ++i ? 前面都是一样。

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

    Go: 深入理解程序调用

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

    59810编辑于 2024-05-29
  • 来自专栏txp玩Linux

    音视频基础知识(4):I、P、B、GOP

    一、H264类型定义: 在H264的编码中,通常以三种不同类型的来表示传输的画面,分别是I、P、B。 P:P指的是前向参考,它需要参考前一的图片才能够正确把数据解码出来。 B:B指的是双向参考,它需要参考前一数据和后一数据才能够正常把数据解码出来。 但是它也有自身的缺点,那就是I的体积比较大,假设在传输视频中全部采用I去传输,那整个网络链路都承受着巨大的压力。所以,I就要配合P、B等进行数据的传输。 P:P又称之为前向参考,此的特点是需要参考前一的图像信息才可以正确把图像解码出来。P指的是这一和前一的差别,并通过将图像序列中已经编码后的冗余信息充分去除来压缩传输数据量的编码图像。 B:B也称之为双向参考,B的特点是以前面的(I或者P)或者后面的(也是I、P)作为参考找出B的预测值,并且取预测差值和预测矢量进行传送。

    9.1K32编辑于 2022-11-28
  • 来自专栏C语言与数据结构算法

    云边诗亭——函数

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

    26210编辑于 2025-11-18
  • 来自专栏跟我一起学编程

    函数的创建和销毁

    中,局部变量的位置是从低地址到高地址分配的。 4. 函数调用 当上述过程完成后,函数调用就开始执行了。此时,新的已经被创建并保存在中。 二、函数的销毁 函数的销毁是在函数返回时进行的。在函数返回之前,需要将中的信息恢复并将其从中弹出。具体的销毁过程如下: 1. 减小指针 在完成上述过程后,需要将指针(P)向下移动,以便将当前中弹出。当指针恢复到上一个的位置时,程序会从该处继续执行,直到遇到下一个函数调用。 的大小限制: 的大小是由局部变量、函数参数和其他信息所占用的内存大小决定的。在设计函数时,我们应该合理估计局部变量的大小和数量,避免过大导致溢出。 在函数调用过程中,确保返回值的存储和传递方式正确,避免返回值在销毁之后变得不可访问。 4. 异常处理: 在函数执行过程中,可能会出现异常情况。

    69910编辑于 2024-03-21
  • 来自专栏C/C++爱好者

    函数的创建和销毁

    ---- 函数的创建和销毁::   ebp,esp这两个寄存器中存放的是地址,这两个地址是用来维护函数的,edp被称为底指针,esp被称为顶指针。push:压:给顶放一个元素。 pop:出:给顶删一个元素,lea:加载有效地址。dword=4byte。 push ebx push esi push edi lea edi,[ebp-0E4h] mov ecx,39h 答:首先为此次函数调用创建函数,在函数找空间存放局部变量值。 2.为什么局部变量的值是随机值? 随机值是系统开辟完函数后系统随机放进去的。 3.函数是怎么传参的? 4.形参和实参是什么关系? 形参是实参的临时拷贝,值相同但空间不同,因此改变形参的值不会影响实参的值。 5.函数调用结束后怎么返回的?

    1.1K30编辑于 2023-04-12
  • 来自专栏《数据结构》

    函数的创建和销毁

    ---- 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.4K20编辑于 2023-04-16
  • 来自专栏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) 函数在调用之前就把参数从右向左进行压;真正进入函数后通过指针的偏移量找到形参

    66310编辑于 2024-01-22
  • 来自专栏用户9199536的专栏

    C++|Compiler|活动记录(

    活动记录(Activation Record),常称(stack frame)。 4 4 4 4 简单说来就是一个是将未计算的参数表达式直接应用到函数内部, 一个是计算参数表达式的值,传入函数计算。 ---- 嵌套过程 静态链(Static Link) 嵌套函数中,内部函数调用的可见外部函数调用的中的变量。 如果儿子1调用儿子2,那么事实上儿子1是通过父亲访问到的儿子2,因此不能直接传儿子1的,而是先回溯到父亲的,再把父亲的指针作为第一个参数传递给儿子2. F_allocLocal在上分配局部变量。

    1.9K40发布于 2021-11-22
  • 来自专栏学习成长指南

    函数的创建和销毁

    4.形参和实参到底是怎样的关系? 5.函数如何进行调用的? 6.函数调用结束之后是如何返回的? 相信在学习的过程中,你对上面的问题或多或少都会有些困惑,今天的博客--函数的创建和销毁就可以帮助你解决这些困惑; 这些都是和函数的的创建和销毁有关,这个函数在不同版本的编译器有关,略有差异但是大致相同 ,那么把esp赋值给ebp就相当于是ebp指向esp的位置,也就是说我们的ebp指向了新的底 (3)第三行的esp减去oE4h这个就是在给main函数创建,我们esp减去一个值就是向上移动,移动到一个新的位置 ,移动的距离就是0E4h,这个时候ebp和esp各自指向了新的底和新的顶,我们这个时候就完成了main函数的创建; (4)接下来反汇编里面是3个push,这三个都是进行压的操作,压完成之后的情况如下图所示 ebp就找到main函数的底,这个时候的顶就变成了00C21450,这个指令还记得是什么吗,就是我们调用函数之前记住的指令,方便我们对调用完之后找到下一个指令,这个时候就发挥了作用; (4)接下来的指令

    49700编辑于 2025-02-24
领券