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

2023-12-29

我正在准备一些 C 语言培训材料,我希望我的示例适合典型的堆栈模型。

Linux、Windows、Mac OSX(PPC 和 x86)、Solaris 和最新的 Unix 中的 C 堆栈朝什么方向发展?


堆栈增长通常并不取决于操作系统本身,而是取决于其运行的处理器。例如,Solaris 在 x86 和 SPARC 上运行。 Mac OSX(正如您所提到的)在 PPC 和 x86 上运行。 Linux 可以在一切上运行,从工作中的 System z 到微不足道的小手表 http://web.archive.org/web/20090322124254/http://www.research.ibm.com/WearableComputing/linuxwatch/linuxwatch.html.

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

处理器及其方向是:

  • x86:向下。
  • SPARC:可选。标准 ABI 使用羽绒。
  • PPC:我认为下降了。
  • System z:在一个链表中,我没有骗你(但仍然失败,至少对于 zLinux 来说)。
  • ARM:可选,但 Thumb2 仅具有向下的紧凑编码(LDMIA = 之后递增,STMDB = 之前递减)。
  • 6502:向下(但只有256字节)。
  • RCA 1802A:任何你想要的方式,服从 SCRT 实施。
  • PDP11:下。
  • 8051:上。

最后几台显示了我的年龄,1802 是用于控制早期航天飞机的芯片(我怀疑,根据它的处理能力来感应门是否打开:-),以及我的第二台计算机,COMX-35 http://en.wikipedia.org/wiki/Comx-35(按照我的ZX80 http://en.wikipedia.org/wiki/Zx80).

PDP11 详细信息收集自here http://en.wikipedia.org/wiki/PDP-11_architecture, 8051 详情来自here http://what-when-how.com/8051-microcontroller/8051-register-banks-and-stack/.

SPARC架构使用滑动窗口寄存器模型。架构上可见的细节还包括寄存器窗口的循环缓冲区,该缓冲区有效并在内部缓存,在上溢/下溢时带有陷阱。看here http://icps.u-strasbg.fr/people/loechner/public_html/enseignement/SPARC/sparcstack.html了解详情。作为SPARCv8 手册说明 http://www.gaisler.com/doc/sparcv8.pdf#page=53、SAVE 和 RESTORE 指令类似于 ADD 指令加上寄存器窗口旋转。使用正常数而不是通常的负常数将产生向上增长的堆栈。

上述 SCRT 技术是另一种技术 - 1802 使用一些或十六个 16 位寄存器进行 SCRT(标准调用和返回技术)。一个是程序计数器,你可以使用任何寄存器作为PC机SEP Rn操作说明。一个是堆栈指针,两个总是指向 SCRT 代码地址,一个用于调用,一个用于返回。No寄存器以特殊方式处理。请记住,这些细节来自记忆,它们可能不完全正确。

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

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

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

在完成所有基于 6502/6809/z80 堆栈的代码之后,一开始很难理解,但仍然以一种令人头晕目眩的方式优雅。此外,该芯片的一大卖点是全套 16 个 16 位寄存器,尽管您立即丢失了其中 7 个(5 个用于 SCRT,两个用于 DMA 和内存中断)。啊,营销战胜现实:-)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大多数现代系统中堆栈增长的方向是什么? 的相关文章

随机推荐

  • Pandas:将操作应用于多索引中的重复列

    我有 MultiColumns 第二级重复包含Job Openings and Hires 我想为每个顶级列减去一个 但我所做的一切都会让我陷入索引错误或切片错误 我怎样才能计算它 样本数据 gt gt gt df head Out 25
  • python中有序字典的有序字典

    我需要一个存储字典的字典数据结构 如下所示 custom 1 a np zeros 10 b np zeros 100 2 c np zeros 20 d np zeros 200 但问题是我在代码中多次迭代这个数据结构 每次迭代它时 我都
  • 无法获取用于gunicorn 的访问日志

    我在 nginx 后面运行 Gunicorn 我想将gunicorn 中的错误记录到gunicorn error log 并将访问日志记录到gunicorn access log 我的错误日志有效 但访问日志无效 我做错了什么 这是我的gu
  • Keras 准确率停留在 50%

    Code import numpy as np from keras preprocessing image import ImageDataGenerator from keras models import Sequential Mod
  • 如何调用类的析构函数?

    我有一个简单的 C 代码 但我不知道如何使用析构函数 class date public int day date int m day m date cout lt lt I wish you have entered the year n
  • setMaximumFractionDigits 的问题

    setMaximumFractionDigits 不适用于以下代码 NSString input 80 90 NSNumberFormatter numberFormatter NSNumberFormatter alloc init nu
  • 在傅立叶插值的上下文中返回函数的“传统”符号

    在数值分析中 我们学生有义务在 R 中实现代码 给定函数 f x 找到其傅立叶插值 tN x 并计算插值误差 f x t N x int 0 2 pi f x t N x 2 或各种不同的 N 我首先尝试根据以下公式计算 d 系数 d fr
  • C#:实时组合框更新

    我一直在尝试将文本文件加载到组合框中 然后创建一个按钮将我在组合框中所做的任何更改保存回文本文件 问题是 当我在组合框中输入某些内容时 所选的 项目 不会更新 我可以更改句子 但是一旦单击 保存 按钮 这也会更新组合框 它就会回到我编辑之前
  • 以 root 身份启动 Mysql

    我已经以 root 身份在我的测试服务器上启动了 mysql 我已经添加了 user root my cnf 中的行 由于我希望测试服务器升级到生产服务器 因此我想注释掉这一行并重新启动 有没有什么副作用 预期数据丢失 MySQL 的 ro
  • 出现错误:没有为一个或多个必需参数给出值

    下面是我的更新查询 它工作正常 但是当我添加时int DrId在参数字段 最后 检查条件条件 在此之后它向我显示以下错误 No value given for one or more required parameters 错误在哪里 因为
  • Node.js 在 openshift 中的部署

    我试图将 Node js 应用程序部署到 openshift 如此链接所示here http myapp jeewan rhcloud com 我理解这段代码 var http require http var server http cr
  • Sqlalchemy 如果表不存在

    我编写了一个模块 用于创建一个空数据库文件 def create database engine create engine sqlite myexample db echo True metadata MetaData engine me
  • 使用 RxJava 的状态机?

    我正在尝试全力以赴地使用 RxJava 并解决我遇到的这个问题 但它似乎非常不适合它 因为 RxJava 似乎不想处理任何类型的状态 而只是传递事件并改变它们来处理它们 我尝试用 RxJava 模拟的基本状态机行为是这样的 在应用程序启动事
  • 无法使用nodemailer发送html文本

    我无法使用 nodemailer 在邮件中发送 html 文本 exports send function req res console log req query var mailOptions to req query email s
  • 检查服务器上是否存在文件

    我正在尝试检查服务器上是否存在 ASP NET 网页后面带有 C 代码的文件 我知道该文件确实存在 因为我事先用一段代码将其放在服务器上 任何人都可以看到为什么找不到该文件 这是代码 wordDocName specifications C
  • Google Contacts API asp.net 设置和授权令牌

    是否有任何好的示例展示如何填写应用程序设置来创建请求设置 这是代码google https developers google com google apps contacts v3 using Google Contacts using
  • Python 中是否缓存了常量计算?

    假设我在 Python 中有一个函数 它使用一个常量计算的浮点值 如 1 3 def div by 3 x return x 1 3 如果我重复调用该函数 是否会自动缓存 1 3 的值以提高效率 或者我必须手动执行以下操作 def div
  • 创建主从表和对话框,如何重用相同的对话框来创建和编辑

    我正在尝试创建一个对话框 该对话框将用于创建对象和更新对象 因此 如果我碰巧单击 新建 按钮 我将看到一个包含要填充的空字段的对话框 或者如果我单击某个条目的编辑按钮 该条目的数据将显示在对话框中进行更新 按照 primefaces 展示版
  • 如何定义向量结束以便它不会无休止地继续下去?

    目前我有一个文本文件 其中包含与不同音乐剧艺术家有关的信息 David Byrne 1 Talking Heads Lead Vocals Chris Frantz 1 Talking Heads Drummer Tina Weymouth
  • 大多数现代系统中堆栈增长的方向是什么?

    我正在准备一些 C 语言培训材料 我希望我的示例适合典型的堆栈模型 Linux Windows Mac OSX PPC 和 x86 Solaris 和最新的 Unix 中的 C 堆栈朝什么方向发展 堆栈增长通常并不取决于操作系统本身 而是取