首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >大多数现代系统中堆栈增长的方向是什么?

大多数现代系统中堆栈增长的方向是什么?
EN

Stack Overflow用户
提问于 2018-04-19 05:43:42
回答 2查看 0关注 0票数 0

我正在用C编写一些培训材料,我希望我的示例适合典型的堆栈模型。

C堆栈在Linux,Windows,Mac OSX(PPC和x86),Solaris和最新的Unix中增长的方向是什么?

EN

回答 2

Stack Overflow用户

发布于 2018-04-19 14:30:22

堆栈增长通常不取决于操作系统本身,而是取决于其运行的处理器。例如,Solaris在x86和SPARC上运行。Mac OSX(如您所述)在PPC和x86上运行。Linux可以运行在我工作的大型系统z到小型手表上。

如果CPU提供任何选择,则操作系统使用的ABI /调用约定指定如果您希望代码调用其他人的代码,您需要做出哪种选择。

处理器及其方向是:

代码语言:javascript
复制
x86          down
SPARC        selectable.  The standard ABI uses down.
PPC          down, I think.
System z     in a linked list, I kid you not.
             (but still down, at least for zLinux).
ARM          selectable, but Thumb2 has compact encodings only for down (LDMIA (increment after) / STMDB (decrement before))
Mostek6502   down (but only 256 bytes).
RCA1802A     any way you want, subject to SCRT implementation.
PDP11        down.

显示我最近几年的年龄,1802年是用来控制早期穿梭车的芯片(感觉门是否开着,我怀疑它是基于它的处理能力:-),而我的第二台电脑COMX-35(跟着我的ZX80)。

PDP11的细节从这里收集。

SPARC架构使用滑动窗口寄存器模型。体系结构上可见的细节还包括内部有效和缓存的注册窗口的循环缓冲区,以及在上/下溢时使用陷阱。详情请看这里。正如SPARCv8手册所解释的,SAVE和RESTORE指令就像ADD指令加上寄存器窗口旋转一样。使用积极的常数,而不是通常的消极将导致一个向上增长的堆栈。

前面提到的SCRT技术是另一种 - 1802使用了一些或16个用于SCRT(标准调用和返回技术)的16位寄存器。一个是程序计数器,你可以使用任何寄存器作为PC的SEP Rn指令。一个是堆栈指针,两个始终指向SCRT代码地址,一个用于调用,一个用于返回。没有登记册以特殊方式处理。请记住这些细节来自记忆,它们可能不完全正确。

例如,如果R3是PC,R4是SCRT调用地址,R5是SCRT返回地址,R2是“堆栈”(引用在软件中实现),SEP R4将R4设置为PC并开始运行SCRT呼叫代码。

然后它会将R3存储在R2“堆栈”(我认为R6用于临时存储),向上或向下调整它,获取R3之后的两个字节,将它们加载 R3中,然后执行SEP R3并在新地址上运行。

要返回,它会将SEP R5旧地址从R2堆栈中取出,向其中添加两个地址(跳过调用的地址字节),将其加载到R3中并SEP R3开始运行先前的代码。

在所有基于6502/6809 / z80堆栈的代码之后,很难将头部包裹起来,但它仍然是一种优雅的方式。该芯片的一大卖点还是16个16位寄存器,你立即丢失了7个(SCRT 5个,DMA 2个,内存中断)。啊,营销胜过现实的胜利。

System z实际上非常相似,使用其R14和R15寄存器进行呼叫/返回。

票数 0
EN

Stack Overflow用户

发布于 2018-04-19 15:41:20

在C ++(适用于C)stack.cc中

代码语言:javascript
复制
static int
find_stack_direction ()
{
    static char *addr = 0;
    auto char dummy;
    if (addr == 0)
    {
        addr = &dummy;
        return find_stack_direction ();
    }
    else
    {
        return ((&dummy > addr) ? 1 : -1);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档