当前位置:首页 » 服务存储 » 栈顶单元是堆栈存储器的第几单元
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

栈顶单元是堆栈存储器的第几单元

发布时间: 2022-07-22 02:37:55

Ⅰ 单片机理论高手请进!

这些问题都是基本的问题,说不清楚!
我只说一下指针问题吧!指针在硬件和软件中都是很重要的一个知识点!
指针在电脑、单片机中的汇编语言、C语言中很重要,也很难!
我只讲一下再汇编语言中的。
堆栈和指针是不可分割的,而堆栈是一个特殊的存储器,是临时存储器。给你打一个比方,这堆栈就是一个仓库先放进去的在最底下,后放进去的在上面,当你拿出他们的时候,你只能先拿最上面的,也就是最后放进去的。即所谓的‘先进后出,后进先出’,并且堆栈有特殊的数据传输指令,即‘PUSH’和‘POP’,有一个特殊的专为其服务的单元,即堆栈指针SP,每当执一次PUSH指令时,SP就(在原来值的基础上)自动加1,每当执行一次POP指令,SP就(在原来值的基础上)自动减1。由于SP中的值可以用指令加以改变,所以只要在程序开始阶段更改了SP的值,就可以把堆栈设置在规定的内存单元中,如在程序开始时,用一条MOV SP,#5FH指令,就时把堆栈设置在从内存单元60H开始的单元中。一般程序的开头总有这么一条设置堆栈指针的指令,因为开机时,SP的初始值为07H,这样就使堆栈从08H单元开始往后,而08H到1FH这个区域正是8031的第二、三、四工作寄存器区,经常要被使用,这会造成数据的混乱。不同作者编写程序时,初始化堆栈指令也不完全相同,这是作者的习惯问题。当设置好堆栈区后,并不意味着该区域成为一种专用内存,它还是可以象普通内存区域一样使用,只是一般情况下编程者不会把它当成普通内存用了。

最后想告诉你,如果你想学好单片机就找一本单片机的课本好好研究一下,多注重硬件方面的问题,这样对你的以后电脑的学习,C语言的学习都是大有益处的.

Ⅱ 一个堆栈的栈顶是第一个元素stack[0]还是最后一个元素stack[max]

一个堆栈的栈顶是第一个元素是stack[0]。绝对不会是stack[max],因为栈的最后一个元素是stack[max - 1]。

Ⅲ 什么是堆栈堆栈区在RAM中的地址空间范围是多少

堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的[1]。堆这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。在内存储器(随机存储器)中开辟一个区域作为堆栈,叫软件堆栈;用寄存器构成的堆栈,叫硬件堆栈。
单片机应用中,堆栈是个特殊存储区,堆栈属于RAM空间的一部分,堆栈用于函数调用、中断切换时保存和恢复现场数据。堆栈中的物体具有一个特性:第一个放入堆栈中的物体总是被最后拿出来,这个特性通常称为先进后出(FILO-First-In/Last-Out)。堆栈中定义了一些操作,两个最重要的是PUSH和POP。PUSH(入)操作:堆栈指针(SP)加1,然后在堆栈的顶部加入一个元素。POP(出栈)操作相反,出栈则先将SP所指示的内部ram单元中内容送入直接地址寻址的单元中(目的位置),然后再将堆栈指针(SP)减1。这两种操作实现了数据项的插入和删除。

Ⅳ 存储器中的堆栈

堆栈是存储数据的一种方法,是后进先出的顺序,就像你往一个箱子里放东西,后放进去的在上面,所以拿时就是先拿上面的了。就是刚调进数据就可以马上用的。

Ⅳ (2) 堆栈栈顶6个内存单元的地址及内容分别是什么

EAX
ECX
EDX
EBX
ESP
EBP
分别是传入的参数和栈顶,栈顶指针。

Ⅵ 堆栈的栈底和栈顶是什么关系

堆栈的栈底和栈顶是相对的。一端被称为栈顶,相对地,就把另一端称为栈底。

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。一端被称为栈顶,相对地,就把另一端称为栈底。

堆栈按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

(6)栈顶单元是堆栈存储器的第几单元扩展阅读:

计算机中的堆栈主要用来保存临时数据,局部变量和中断/调用子程序程序的返回地址。在栈操作过程中,有一个专门的栈指针(习惯上称它为TOP),指出栈顶元素所在的位置。堆栈指针总是指向栈顶元素。堆栈可以使向下生长的(向低地址),也可以是向上生长的。

如果堆栈是向上生长的,数据入栈的时候,堆栈指针先加1,再压栈。出栈的时候先弹出数据,堆栈指针再减1。如果堆栈是向下生长的,数据入栈时指针将减1,数据出栈时指针将加1。

Ⅶ 什么是堆栈存储器

堆栈不是是什么具体的存储器,都是是内存,只不过有不同的用处。就像一个柜子,你可以分成一个大柜门,另一些空间可以做成些抽屉。其实都是存储,但是可以把功能更详细的分开,各自有自己的适用场合。

内存堆栈和楼上说的数据结构堆栈概念上还是有很大区别的。
这里的堆和栈不仅仅是按照数据结构里的堆和栈来理解,更倾向于表示两种不同作用的内存区域。
栈是有编译器来管理的,具体的大小可能根据编译器不同而异,编译器也可以手动设置栈的大小,通常有1M和2M的,比如在你定义变量时,由编译器将变量压栈,作用域结束,编译器控制变量出栈,程序员不能很直接的操作栈。
堆内存是向系统申请的内存,由程序员管理的,你new或者malloc时系统正常情况下回给你一块堆内存空间,你爱什么时候存数据都行,想存什么就存什么,想什么时候释放(delete,free)都可以。堆的大小没有什么具体数值,看机器的运行状况,配置状况而定。

Ⅷ 什么是堆栈

堆:顺序随意

栈:先进后出

堆和栈的区别

一、预备知识—程序的内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

二、例子程序

这是一个前辈写的,非常详细

//main.cpp

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()

{

int b; 栈

char s[] = "abc"; 栈

char *p2; 栈

char *p3 = "123456"; 123456\0在常量区,p3在栈上。

static int c =0; 全局(静态)初始化区

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

分配得来得10和20字节的区域就在堆区。

strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

}

二、堆和栈的理论知识

2.1申请方式

stack:

由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间

heap:

需要程序员自己申请,并指明大小,在c中malloc函数

如p1 = (char *)malloc(10);

在C++中用new运算符

如p2 = (char *)malloc(10);

但是注意p1、p2本身是在栈中的。

2.2

申请后系统的响应

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,

会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

2.3申请大小的限制

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

2.4申请效率的比较:

栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.

另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活

2.5堆和栈中的存储内容

栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

2.6存取效率的比较

char s1[] = "aaaaaaaaaaaaaaa";

char *s2 = "bbbbbbbbbbbbbbbbb";

aaaaaaaaaaa是在运行时刻赋值的;

而bbbbbbbbbbb是在编译时就确定的;

但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。

比如:

#include

void main()

{

char a = 1;

char c[] = "1234567890";

char *p ="1234567890";

a = c[1];

a = p[1];

return;

}

对应的汇编代码

10: a = c[1];

00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]

0040106A 88 4D FC mov byte ptr [ebp-4],cl

11: a = p[1];

0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]

00401070 8A 42 01 mov al,byte ptr [edx+1]

00401073 88 45 FC mov byte ptr [ebp-4],al

第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。

?

2.7小结:

堆和栈的区别可以用如下的比喻来看出:

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

堆和栈的区别主要分:

操作系统方面的堆和栈,如上面说的那些,不多说了。

还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。

虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。

Ⅸ 51单片机的堆栈区在那里低128还是高128字节单元

寻址区
30H~7FH:一般数据区,堆栈区

寄存器组就是R0-R7,一共是8*4是32字节
位寻址就是对每一位寻址,一个字节可以有8位,位地址可以从0-7F,一共是16个字节
30-7FH有80个字节单元,可以采用字节字节寻址的方法访问
堆栈区及堆栈指示区 堆栈是在片内RAM中数据先进后出的一个存储区域。堆栈指针SP是存放当前堆栈栈顶所对应的存储单元地址的一个8位寄存器。系统复位后SP为07H,而07H一般是寄存器区,所以,一般可以通过对SP赋值,可以使堆栈区设定在RAM中的某一区域,但堆栈的深度以不超过片内RAM区空间为限

Ⅹ 简述堆栈的存取点写出栈操作指令

在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆,顺序随意。栈,后进先出(Last-In/First-Out)。
单片机堆栈操作指令如下:
PUSH
direct(堆栈指令)其作用是先将栈指针SP的内容加1,然后将直接寻址单元中的数压入到sP所指的单元中。若数据已入栈,则SP指向最后堆人数据所在的存储单元(即指向栈顶)。
POP
direct(出栈指令)其作用是先将栈指针SP所指出单元的内容送入直接寻址单元中,然后将栈指针SP的内容减1,此时SP指向新的栈顶。
使用堆栈时,一般需设定SP的初始值。堆栈原则上可以设在内部RAM的任意区域,但为使用方便,一般设在30H~7FH。另外,需注意留出足够的存储单元作栈区,否则可能发生数据重叠,引起程序混乱。
由于入栈的第一个数必须存放在SP+1的存储单元,故实际栈顶是在SP+1所指出的单元。