Ⅰ 单片机中那部分是堆栈结构
答:
堆栈是在单片机片内的数据存储器里开辟的一段存储空间,要明白哪部分是堆栈结构,就要搞清楚单片机的数据存储器。
51单片机片内有256字节的数据存储器空间。00H-20H是工作寄存器空间,20H-30H是位寻址区,30H-80H是数据存储区,这段空间可以设置堆栈,80H-FFH是特殊功能存储器空间。所以属于堆栈的空间为30H-80H。但在实际中这段空间还要存放数据,所以,要合理安排。
堆栈使用是要先设置初始地址,用SP 设置,PUSH指令用来把数据推入堆栈,POP从堆栈取出数据。采用“后进先出”原则,每压进一个数据,SP指针加一。
Ⅱ 80486中,什么是堆栈堆栈主要应用在哪些场合
堆栈是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。堆栈主要应用在:暂时存放数据和地址。对这个存储区存入的数据,是一种特殊的数据结构。
所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。
(2)堆栈在存储器中的位置扩展阅读
堆栈处理器的指令可以分为四类:算术逻辑运算、堆栈调整、程序分支和存储器访问。堆栈指令集与常见的 RISC 处理器指令集的不同是指令的寻址方式,堆栈指令多为默认寻址方式,指令操作数的地址被处理器设定为某一个既定的堆栈位置,不需要将地址信息存放于指令中。
这种方式增加了堆栈处理器的指令压缩度,但固定的操作数地址会使得指令的操作数指定不够灵活,堆栈处理器中设计了能够调整堆栈中数据存放顺序的堆栈调整指令。
堆栈调整指令可以在同一堆栈内部和堆栈间调整数据的位置,堆栈调整指令和堆栈的先进后出特性使得堆栈中特定位置的数据可以灵活地改变。
Ⅲ 堆栈在内存的什么区
五大内存分区
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
首先,我们看一个例子:
void f() { int* p=new int[5]; }
这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p.在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,
好了,我们回到我们的主题:堆和栈究竟有什么区别?
主要的区别由以下几点:
1、管理方式不同;
2、空间大小不同;
3、能否产生碎片不同;
4、生长方向不同;
5、分配方式不同;
6、分配效率不同;
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak.
空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit.注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。
生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
Ⅳ 存储器中的堆栈
堆栈是存储数据的一种方法,是后进先出的顺序,就像你往一个箱子里放东西,后放进去的在上面,所以拿时就是先拿上面的了。就是刚调进数据就可以马上用的。
Ⅳ JAVA中的各种东西存储在什么地方
2、堆栈(栈)位于通用RAM(随机访问存储器)中,但是通过堆栈指针可以直接从堆栈指针那里获得直接支持。堆栈指针向下移动,则分配新的内存;向上移动,则释放那些内存。其快速有效性仅次于寄存器。创建程序时,JAVA必须知道存储在堆栈区的所有项的确切生命周期,以便上下移动堆栈指针。比如,JAVA对象引用存储于堆栈区,但对象并不存储于其中。3、堆一种通用的内存池(也位于RAM区),用于存放所有的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间,因此堆里分配存储有很大的灵活性。当需要一个对象时,只需要new一个即可,当执行这行代码时,会自动在堆里进行存储分配。不过,用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。4、常量存储常量值通常在直接放在程序代码内部,这样做是安全的,因为它永远不会被改变。5、非RAM存储如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。流对象:在流对象中,对象转成字节流,通常被发送给另外一台机器。持久化对象:对象被存放于磁盘上。
Ⅵ 单片机中那部分是堆栈结构
答:
堆栈是在单片机片内的数据存储器里开辟的一段存储空间,要明白哪部分是堆栈结构,就要搞清楚单片机的数据存储器。
51单片机片内有256字节的数据存储器空间。00H-20H是工作寄存器空间,20H-30H是位寻址区,30H-80H是数据存储区,这段空间可以设置堆栈,80H-FFH是特殊功能存储器空间。所以属于堆栈的空间为30H-80H。但在实际中这段空间还要存放数据,所以,要合理安排。
堆栈使用是要先设置初始地址,用SP
设置,PUSH指令用来把数据推入堆栈,POP从堆栈取出数据。采用“后进先出”原则,每压进一个数据,SP指针加一。
Ⅶ 关于堆栈的物理地址问题
物理地址的求法都一样,不管是堆栈还是数据段
堆栈的物理地址是:段首地址*16+偏移地址,
如上题
段首地址及为SS内的内容,2345h*16=23450H
偏移地址是SP内的内容,所以物理地址是23450H+0100H=23550H
若堆栈存放10B个数据,由堆栈的特性可知,sp的内容要-10
所以,sp的内容为0096H
希望我的回答能帮到你
Ⅷ 堆栈是那里的存储空间是在内存上还是硬盘上面的
内存中独立的一块存储区域,是内存上的
Ⅸ 堆栈中的高,低地址是什么意思,属于汇编知识还是其他谢谢直白回复
堆栈是在内存中指定的一段特殊存储区,春起始单元的地址叫栈底,当前存储单元地址叫栈顶,堆栈存储区一旦指定,栈底就固定不变了,而栈顶是随入栈、出栈操作呈动态。而不同机型的堆栈设计,有两种情况:一是每入栈一个数,栈顶地址加1,每出栈一个数,栈顶地址减1,即堆栈区是由内存的低地址向高地址。另一种是每入栈一个数,栈顶地址减1,每出栈一个数,栈顶地址加1,即堆栈区是由内存的高地址向低地址。
高地址、低地址的概念是计算机领域里通用的,并非汇编知识特有。高地址、低地址是相对而言,即相对地址编码的大小而言。
Ⅹ 在单片机中什么是堆栈它的作用是什么
在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。
堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的。对这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。在内存储器(随机存储器)中开辟一个区域作为堆栈,叫软件堆栈;用寄存器构成的堆栈,叫硬件堆栈。
(10)堆栈在存储器中的位置扩展阅读:
栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据在多个线程或者多个栈之间是不可以共享的,但是在栈内部多个值相等的变量是可以指向一个地址的,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。