13

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

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

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

4

2 回答 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指针。

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

于 2010-05-01T23:01:51.833 回答
4

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

于 2010-04-30T13:35:50.127 回答