递归&栈帧空间】的更多相关文章

递归函数: 自己调用自己的函数 def digui(n): print(n) if n > 0: digui(n-1) print(n) digui(5) 执行结果: 5 4 3 2 1 0 0 1 2 3 4 5 执行过程: """ 代码从上到下执行: digui(5) print 5 digui(4) print 4 digui(3) print 3 digui(2) print 2 digui(1) print 1 digui(0) print 0 n !>…
source:http://blog.csdn.net/qq_29403077/article/details/53205010 一.地址空间与物理内存 (1)地址空间与物理内存是两个完全不同的概念,真正的代码及数据都存在物理内存中. 物理储存器是指实际存在的具体储存器芯片,CPU在操纵物理储存器的时候都把他们当做内存来对待,把他们看成由若干个储存单元组成的逻辑储存器,这个逻辑储存器就是我们所说的地址空间. 地址空间大小与逻辑储存器大小不一定相等. (2)进程的地址空间分布 进程的地址空间包括:…
前几天看System V AMD64 ABI标准的时候发现栈帧的顶部后面有一块"red zone",在学cs:app3e/深入理解操作系统的时候并没有遇到这个,总结一下. 引用标准中的话: The 128-byte area beyond the location pointed to by %rsp is considered to be reserved and shall not be modified by signal or interrupt handlers. There…
X86-64寄存器和栈帧 概要 说到x86-64,总不免要说说AMD的牛逼,x86-64是x86系列中集大成者,继承了向后兼容的优良传统,最早由AMD公司提出,代号AMD64:正是由于能向后兼容,AMD公司打了一场漂亮翻身战.导致Intel不得不转而生产兼容AMD64的CPU.这是IT行业以弱胜强的经典战役.不过,大家为了名称延续性,更习惯称这种系统结构为x86-64. X86-64在向后兼容的同时,更主要的是注入了全新的特性,特别的:x86-64有两种工作模式,32位OS既可以跑在传统模式中,…
简介 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果.除此之外,它们还各自具有一些特殊功能.通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确.合理地使用它们. 16位cpu通用寄存器共有 8 个:AX,BX,CX,DX,BP,SP,SI,DI. 八个寄存器都可以作为普通的数据寄存器使用. 但有的有特殊的用途:AX为累加器,CX为计数器,BX,BP为基址寄存器,SI,DI为变址寄存器,BP还可以是基 指针,S…
运行时栈帧结构 栈帧(Stack Frame) 是用于虚拟机执行时方法调用和方法执行时的数据结构,它是虚拟栈数据区的组成元素.每一个方法从调用到方法返回都对应着一个栈帧入栈出栈的过程. 每一个栈帧在编译程序代码的时候所需要多大的局部变量表,多深的操作数栈都已经决定了,并且写入到方发表的 Code 属性之中,一次一个栈帧需要多少内存,不会受到程序运行期变量数据的影响,仅仅取决于具体的虚拟机实现. 一个线程中方法调用可能很长,很多方法都处于执行状态.对于执行引擎来说,只有处于栈顶的栈帧才是有效的,称…
写在前面的话:Java虚拟机是一门学问,是众多Java大神们的杰作,由于我个人水平有限,精力有限,不能保证所有的东西都是正确的,这里内容都是经过深思熟虑的,部分引用原著的内容,讲的已经很好了,不在累述.当然在这里,不可能所有细节都深层次的分析,只讲到一些比较重要的概念,由于对计算机组成原理理解不深,绝大部分只能采取黑盒理论来分析.   运行时的栈帧结构(什么是栈帧?)     栈帧是虚拟机进行调用和方法执行的数据结构,简单的说栈帧其实就是JVM运行时数据区虚拟机机栈(JVM Stack)的栈元素…
简介 Java栈是一块线程私有的内存空间.java堆和程序数据相关,java栈就是和线程执行密切相关的,线程的执行的基本行为是函数调用,每次函数调用的数据都是通过java栈来传递的. Java栈与数据结构中的stack有着类似的含义,都是先进先出的数据结构,只支持出栈和入栈操作.java栈中保存的主要内容为栈帧.每一次函数调用都有一个对应的栈帧被压入java栈.每一个函数调用结束,都会有一个栈帧被弹出java栈.当前正在执行的函所对应的栈帧位于当前栈的栈顶,它保存当前函数的局部变量,中间运算结果…
栈帧(stack frame)是在程序的运行时栈中分配的内存块,用于特定的函数调用 如果一个函数没有执行则不需要内存,当函数被调用时就需要用到内存 1.传给函数的参数的值需要存储到函数能够找到它们的位置 2.函数在执行过程中可能需要临时的存储空间,通过声明局部变量来分配这类临时空间,这些变量在函数内部使用,函数调用完后,就无法再访问它们 在将控制权转交给函数之前,编译器会插入代码,将函数参数放入栈帧内,并分配足够的内存,以保存函数的局部变量 函数的返回地址也存储在新的栈帧内 使用栈帧使得递归成为…
1.基本结构: 如上图所示,是通用的栈帧结构.大致分两块,调用者函数P和被调用者函数Q. 对P来说,要做的工作是把传递参数中多于6个的部分压栈,随后把Q返回时要执行的下一条指令的地址压栈. 对Q来说,要做的工作分3块,一是将要保存寄存器的值压栈,二是将要保存的局部变量压栈,三是把多余参数压栈.刚看到这里你可能不懂,没关系,接下来会分别介绍这3块. 2.参数构造部分: 首先介绍参数构造部分,其实它就对应调用者函数P的多余参数压栈操作,因为函数调用一环套一环,P调用Q,Q可能调用R,当Q调用R时,若…