当经典MacOS进入程序时,68000堆栈上有什么?

13

我正在尝试理解一个经典的老款Mac应用程序的入口点。我已经反汇编了第一个CODE资源(不是CODE#0,这是跳转表)。该代码涉及堆栈上的一些变量:0004(A7)处的一个字,从000C(A7)开始的一组长字的数组,其长度为0004(A7)处的值,并且超出该数组的一个最终长字似乎是指向字符字符串的指针。

这组长字的数组乍一看像字符串,因此看起来我们表面上处理的是(int argc,char ** argv)的情况,但“argv”数组内嵌在堆栈框架中。

当Mac OS首次调用程序时,程序应该在其堆栈/寄存器上期望什么?


2
谢谢你的指引,马丁。然而,MacOS比Linux早了很多年,并且肯定不是基于Unix运行时(“资源和数据分叉”有人知道吗?)。我正在查看的代码几乎与Unixy argc、argv入口约定相似,但并非完全相同。 - John Källén
2个回答

5

我不知道这是否有用(我只是因为标题中有68000才看了这个问题……!),但古老的Mac开发信息似乎在这里:

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

(猜测: argv 数据很可能实际上在堆栈上。将命令行拆分成部分的一种明显方法是从末尾开始而不是从开头开始。倒着遍历命令行(使用 -(An) 寻址模式)并以此找到这些部分。这可能会稍微复杂一些,但是68000可以将立即值与内存进行比较,因此检查 \ 等等(如果Mac OS这样做)并不麻烦。一旦找到一段的开头,将其地址放入堆栈中--由于预减,您可能已经有了开头(但是PEA 无论如何都会使此过程变得容易)--并将0插入其结尾以终止它。一旦所有指针都被推送,加载程序就可以执行 MOVEA.L A7,-(A7)PEA A7 来推送 argv 指针。

(如果您编写了它,这可能会很好用,因此如果实际采用了这种方法,我也不会感到惊讶。)


1
谢谢提供链接,这会非常方便。不幸的是,我一直在看错误的代码,以为它是入口点;实际上,它似乎是一些硬编码手写汇编片段,用于对字符串数组进行一些聪明的操作,是完全在堆栈上完成的。 - John Källén
@John:特别是看一下 http://developer.apple.com/legacy/mac/library/documentation/mac/Processes/Processes-15.html#HEADING15-0 。也许你看到的是构建 argc 和 argv 的 C 运行时库。 - Potatoswatter
链接现在已经失效,很遗憾。 - Paul R

4

据我记忆,当首次调用代码资源时,栈中没有任何有趣的内容。经典 Mac OS 没有使用 argc/argv。不过这已经是很久以前的事情了,所以我可能是错的。而且我几年前扔掉了所有旧版的 Inside Mac,所以我不能轻易地核对。


2
实际上,在进入MacOS经典二进制文件时,似乎唯一得到的是指向“A5世界”的A5。我正在查看代码段1中的第一个代码,这与存储在CODE段0中的跳转表中的第一个条目所引用的代码不同。感谢您的帮助。 - John Källén
啊,没错 - A5世界 - QuickDraw全局变量和你的程序全局变量 - 我都忘记了这些。 - Paul R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接