13

古いクラシックMacアプリケーションのエントリポイントを理解しようとしています。最初のCODEリソースを分解しました(ジャンプテーブルであるCODE#0ではありません)。コードはスタックからいくつかの変数を参照します:0004(A7)の単語、長さが0004(A7)の値である000C(A7)で始まる長い単語の配列、およびその配列を超える最後の長い単語文字列へのポインタのようです。

長い単語の配列は一見文字列のように見えるため、「argv」配列がスタックフレームにインラインである点を除いて、表面的には(int argc、char ** argv)の状況を処理しているように見えます。

プログラムがMacOSによって最初に呼び出されたときに、プログラムがスタック/レジスタに何を期待する必要がありますか?

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 A7argv

(これは、コード化すればおそらくうまくいくので、実際に採用されたアプローチであったとしても、私は驚かないでしょう。)

于 2010-05-01T23:01:51.833 に答える
4

メモリから、CODEリソースが最初に呼び出されたとき、スタックに関心のあるものは何もないと思います。従来のMacOSはargc/argvを使用しませんでした。でも久しぶりなので間違っているかもしれませんし、数年前に古いInside Macのボリュームを全部捨ててしまったので、なかなか確認できません。

于 2010-04-30T13:35:50.127 に答える