【问题标题】:What is on the 68000 stack when classic MacOS enters a program?经典 MacOS 进入程序时,68000 堆栈上有什么?
【发布时间】:2010-04-30 12:01:11
【问题描述】:

我正在尝试了解旧的经典 Mac 应用程序的入口点。我已经反汇编了第一个 CODE 资源(不是 CODE#0,它是跳转表)。代码引用堆栈外的一些变量:0004(A7) 处的一个字,从 000C(A7) 开始的长字数组,其长度是 0004(A7) 处的值,以及该数组之外的最后一个长字似乎是一个指向字符串的指针。

长单词数组乍一看像字符串,所以表面上看起来就像我们在处理 (int argc, char ** argv) 的情况,除了“argv”数组在堆栈帧中是内联的。

当一个程序第一次被 Mac OS 调用时,它的堆栈/寄存器应该期待什么?

【问题讨论】:

  • 感谢您的指点,马丁。然而,MacOS 比 Linux 早了好几年,而且肯定不是基于 Unix 运行时(“资源和数据分叉”,有人知道吗?)。我正在查看的代码与 Unixy argc、argv 条目约定几乎但不太相似。

标签: macos assembly calling-convention 68000


【解决方案1】:

我不知道有没有用(我只看了这个问题,因为它的标题中有68000......!)但是ye olde Mac开发信息似乎在这里:

http://developer.apple.com/legacy/mac/library/documentation/macos8/mac8.html

(猜想:argv 数据很可能实际上在堆栈上。将命令行分成几部分的明显方法是从末尾而不是开头开始。向后走命令行(使用 @ 987654324@ 寻址模式)并以这种方式找到碎片。这可能会使事情有点复杂,但是 68000 可以将立即值与内存进行比较,因此检查 \ 等(如果 Mac OS 这样做的话)并不麻烦。一旦找到一个片段的开头,将它的地址放在堆栈上——你可能已经很方便地开始了(由于预先递减)但是PEA 无论如何都会让这很容易——然后在它的末尾插入一个 0 来终止一旦所有的指针都被压入,加载器可以通过MOVEA.L A7,-(A7)PEA A7 来压入argv 指针。

(如果您将其编码,这可能会很好,所以如果它是实际采用的方法,我不会感到惊讶。)

【讨论】:

  • 感谢您的链接,它将变得非常方便。唉,我在看错误的代码,以为它是入口点;它似乎是一些硬编码的手写汇编程序片段,可以用字符串数组做一些聪明的事情,是的,似乎完全在堆栈上。
  • @John:具体参见developer.apple.com/legacy/mac/library/documentation/mac/…。也许您看到的是构造 argc 和 argv 的 C 运行时库。
  • 链接现已损坏,很遗憾。
【解决方案2】:

从记忆中我认为,当您的 CODE 资源第一次被调用时,堆栈上没有任何有趣的东西。经典 Mac OS 没有使用 argc/argv。不过,这已经很长时间了,所以我可能是错的,几年前我扔掉了所有旧的 Inside Mac 卷,所以我不能轻易检查。

【讨论】:

  • 确实,您在进入 MacOS 经典二进制文件时获得的唯一东西似乎是指向“A5 世界”的 A5。我正在查看 CODE 段 1 中的第一个代码,它与存储在 CODE 段 0 中的跳转表中的第一个条目所引用的代码相同。感谢您的帮助。
  • 啊,是的 - A5 世界 - QuickDraw 全局变量和您的程序全局变量 - 我忘记了。
猜你喜欢
  • 2016-01-19
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
相关资源
最近更新 更多