2

6502 マシンの次のコードで問題が発生しています。

C000 LDA #$00
C002 STA $FE
C004 LDA #$20
C006 STA $FF
C008 LDY #$08
C00A LDX #$00
C00C DEY
C00D CPY #$FF
C00F BEQ $C01B
C011 LDA ($FE),Y
C013 CMP #$2F
C015 BPL $C00C
C017 INX
C018 JMP $C00C
C01B BRK

課題は、アドレス 2000 から始まる 2、1、および 4 の数値を格納し、A、X、および Y の値が何であるかを言うことです。

ペンと紙でコードを「実行」していますが、次の理由で C011 で行き詰まりました。
LDA ($FE),Y
この方法で計算されたメモリ アドレスに格納されている値を A にロードします。

  1. 値を選択$FE(最初は 00)
  2. Y の値を追加します (最初の反復では 7)。
  3. 私は今07を持っています
  4. 07 に格納されている値を A にロードします。

これは正しいです?何か不足していますか?2000 2001そうでない場合、とに格納されている値をどこで使用します2002か?

前もって感謝します..

4

3 に答える 3

4

$FE 値を選択 (最初は 00)

実際には、 から 16 ビット値をロードし、その値に$FE加算Yして実効アドレスを取得します。

$00at$FE$20atに保存し$FFたので、ロードされる 16 ビット値は次の$FEようになります。$2000

2000、2001、および 2002 に保存された値をどこで使用するか

WhenYの値は 0、1、および 2 です。ループはY0 から $FF に戻るまで続きます。


6502.txtの「10) インデックス後間接」を参照してください

于 2016-06-04T16:55:55.153 に答える
2

いいえ、あなたは正しくありません。間接インデックス(インデックス付き間接ではなく) アドレッシング モードLDA ($FE),Yを使用する意味がわかりません。間接とは、括弧内の値が 16 ビット ポインターのアドレスであり、下位バイトが最初であることを意味します。これは、先ほど設定した 00 ドルと 20 ドルなので、2000 ドルです。

インデックス付けは Y で行われ、ループの終了条件は Y に基づいているため、それが得られます。A の値は最後に読み取られた値なので、それもあります。

しかし、Weather Vane の回答に対するあなたのコメントと質問は非常に関連性があります。CMP #$2Fとそれに続くBPLとがあるため、他のメモリ位置の値は重要ですINX。CMP は減算のように機能し、比較されたレジスタ < 比較されたメモリの場合、N フラグが設定されます。ここを参照してください

したがって、X の値は、他のメモリ値に依存します。

于 2016-06-05T09:54:20.640 に答える
2

このアドレッシング モードはポスト インデックス間接と呼ばれ、レジスタでのみ使用さYれます。実効アドレスは、address の (リトルエンディアン) コンテンツから形成され、そのアドレス$00FEに追加されます$00FFY

$2000これらの 2 つのページ 0 の場所に格納し、実効アドレスがアクセスしたいデータの 3 バイトを超えるようにY保持します。7$2007

次のように配列に直接アクセスできた可能性があることに注意してください

LDA $2000,Y

ただし、間接的な方法の利点は、事前にアドレスを知る必要がないことです。たとえば、実行時の条件に応じて、複数のテーブルから 1 つを選択してインデックスを作成できます。

于 2016-06-04T17:00:32.180 に答える