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

时间:2010-04-30 12:01:11

标签: macos assembly calling-convention 68000

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

(猜想:argv数据实际上可能在堆栈上。将命令行拆分成部分的一种明显方法是从结束而不是从头开始。向后走命令行(使用-(An)寻址模式)并找到相应的方式。这可能会使事情变得复杂,但是68000可以将立即值与内存进行比较,因此检查\等等并不是很麻烦(如果Mac OS那样做的话)一旦找到一个片段的开头,把它的地址放在堆栈上 - 你可能得到了开始方便(由于预先减少)但PEA在任何情况下都会让这个变得容易 - 并且戳了一下结束所有指针后,加载程序可以MOVEA.L A7,-(A7)PEA A7推送argv指针。

(如果您对其进行编码,这可能会很有效,所以如果实际采用这种方法,我也不会感到惊讶。)

答案 1 :(得分:4)

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