在你提到的情况中,堆栈段寄存器 SS 被设置为 1000H,那么堆栈指针 SP 的值应该被设置为 1000H 减去所需的偏移量。这个偏移量的具体值需要根据具体的 *** 作系统和 CPU 架构来确定。
例如,如果 *** 作系统和 CPU 架构要求堆栈指针 SP 的值比堆栈段寄存器 SS 的值小 128 字节,那么堆栈指针 SP 应该被设置为 1000H - 128 = EE0H。
注意:堆栈指针 SP 的值一般是向下递减的,因为堆栈的数据是从高地址向低地址增长的。这意味着堆栈指针 SP 的值越小,堆栈的使用空间就越大。
单片机里sp是堆栈指针。
堆栈指针SP英文全称为stackpointer,是单片机控制器的组成部件之一,与时控制逻辑电路、指令寄存器译码器、地址指针DPTR、程序计数器等部件共同组成CPU的神经中枢。堆栈指针在单片机里的作用是随时跟踪栈顶地址,以便存取单片机的数据。
每当执一次PUSH指令时,SP就(在原来值的基础上)自动加1,每当执行一次POP指令,SP就(在原来值的基础上)自动减1。
扩展资料
由于SP中的值可以用指令加以改变,所以只要在程序开始阶段更改了SP的值,就可以把堆栈设置在规定的内存单元中,如在程序开始时,用一条MOVSP,#5FH指令,就是把堆栈设置在从内存单元60H开始的单元中。
一般程序的开头总有这么一条设置堆栈指针的指令,因为开机时,SP的初始值为07H,这样就使堆栈从08H单元开始往后,而08H到1FH这个区域正是8031的第二、三、四工作寄存器区,经常要被使用,这会造成数据的混乱。
不同作者编写程序时,初始化堆栈指令也不完全相同,这是作者的习惯问题。当设置好堆栈区后,并不意味着该区域成为一种专用内存,它还是可以象普通内存区域一样使用,只是一般情况下编程者不会把它当成普通内存用了。
参考资料来源:百度百科-单片机
栈的初始化较简单,只需要初始化sp的值,因此只需一条汇编指令init_stack:
ldr sp, =0x34000000
(2440的内存起始地址为0x30000000,现在分给该进程的栈64MB的空间,64MB占用的地址数为0x4000000,加上起始地址0x30000000,为0x34000000)
当你通过brk(),sbrk()或mmap()为你的过程获得新的记忆时,它保证被清零。 但是进程堆栈已经分配给您的进程。alloca()函数没有获得新的堆栈空间,它只返回当前堆栈指针并将指针移动到新块的末尾。 因此,alloca()返回的内存块之前已被您的进程使用。即使你在main中的alloca()之前没有函数,C库和动态加载器也一直在使用堆栈。
根据SP指针指向的位置,栈可以分为满栈和空栈。
1.满栈:堆栈指针SP总是指向最后压入堆栈的数据。
2.空栈:堆栈指针SP总是指向下一个将要放入数据的空位置
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)