2

アセンブリ言語 (Motorola 68k) でのスタックの使用法と実装を理解しようとしています。

MC 68k には 8 つのアドレス レジスタがあり、A7 は特別なものです。2 つのスタック ポインタであるため、「システム スタック ポインタ」の名前を共有します。

また、ユーザー状態とスーパーバイザー状態の 2 つの状態があります。どこ:

user state- 

certain system resources are blocked and A7 accesses the user stack pointer.

supervisor state-

 all system resources are available and A7 accesses the supervisor stack pointer

今、これらの2つの質問に答える方法がわかりません:

68000 に 2 つのハードウェア スタック ポインタがあるのはなぜですか?

コードを書く

  • レジスタ D1、D3、A2 ~ A6 のロングワード値をランタイムスタックに保存します。

    MOVEM D1-D3/A2-A6, -(A7)
    

これは正しいでしょうか?

ここで、「runtimestack」と呼ばれるものが何であるかわかりません。また、(SP) と (A7) の実際の違いが何であるかもわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

9

オペレーティング システムの一般的な要件は、ユーザー プログラムがシステム全体を破壊する能力を非常に制限する必要があるということです。多くのプログラムは、比較的任意の方法で独自のスタック ポインターの値を変更できる必要がありますが、割り込みの処理に使用されるスタック ポインターを変更できるプログラムは、そのスタック ポインターをそのアドレスに設定することにより、任意のスーパーバイザー メモリを破損する可能性があります。メモリー; したがって、次の割り込みは、割り込みに使用されるスタックポインターによって識別されたメモリが何であれ破棄されます。ユーザープログラムはそれを行うことができないため、割り込み処理に使用されるスタックポインターを変更できないようにする必要があります。

68000 は、2 つの個別のスタック ポインター レジスタを持ち、システムがユーザー モードのときに 1 つを使用し、スーパーバイザー モードのときにもう 1 つを使用することで、この問題を処理します。ユーザー モード コードで使用されていたスタック ポインターをスーパーバイザー モード コードが読み取ったり、設定したりできる手段があると非常に便利ですが、逆の機能 (ユーザー モードがスーパーバイザー スタックを参照できるようにする) は必要ありません。 -mode コードは通常、ユーザー モード スタック ポインターを非常に頻繁に操作することはないため、ユーザー モード スタック ポインターに対して 8 つの番号付きアドレス レジスタの 1 つを使用するのではなく、68000 では、それにアクセスするすべてのアクセスをいくつかの特別な方法で行う必要があります。指示。

于 2015-11-30T21:52:07.213 に答える