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 2001and中的值2002

提前致谢..

4

3 回答 3

4

选择 $FE 值(最初是 00)

实际上,它从 加载一个 16 位的值$FE,然后将该值加到Y该值上以获得有效地址。

您已存储$00at$FE$20at $FF,因此从中加载的 16 位值$FE将是$2000

我在哪里使用存储在 2000 2001 和 2002 中的值

WhenY的值为 0、1 和 2。循环将继续,直到Y从 0 环绕到 $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寄存器一起使用。有效地址由地址的(小端)内容构成$00FE$00FFY添加到该地址。

您存储$2000在这两个页面零位置,并Y保持7有效地址为$2007,超出您希望访问的三个字节数据。

请注意,可以直接访问数组

LDA $2000,Y

但是间接方法的优点是您不需要提前知道地址,例如您可以根据运行时条件选择几个表中的一个进行索引。

于 2016-06-04T17:00:32.180 回答