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

Joh*_*lén 13 macos assembly 68000 calling-convention

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

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

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

小智 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指针.

(如果您编写代码,这可能会很好,所以如果实际采用的方法不会让我感到惊讶.)


Pau*_*l R 4

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

  • 事实上,似乎你在进入 MacOS 经典二进制文件时得到的唯一东西就是指向“A5 世界”的 A5。我正在查看 CODE 段 1 中的第一个代码,它与 CODE 段 0 中存储的跳转表中的第一个条目引用的代码不同。感谢您的帮助。 (2认同)