6502间接寻址问题

时间:2016-06-04 14:38:37

标签: assembly 6502 commodore

我在使用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的值是什么。

我" m"跑步"我用笔和纸代码,但由于以下原因我被困在C011:
LDA ($FE),Y
它以A方式加载存储在内存地址中的值:

  1. 选择$FE值(最初为00)
  2. 添加Y的值(第一次迭代时为7)
  3. 我现在有07
  4. 加载A,其值存储在07
  5. 这是对的吗?我错过了什么吗? 如果我不是,我在哪里使用2000 20012002中存储的值?

    提前致谢..

3 个答案:

答案 0 :(得分:4)

  

选择$ FE值(最初为00)

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

您已将$00存储在$FE$20 $FF,因此从$FE加载的16位值将为{{ 1}}

  

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

$2000的值为0,1和2.循环将继续,直到Y从0回到$ FF。

参见" 10)6502.txt中的后索引间接"

答案 1 :(得分:2)

此寻址模式称为后索引间接,仅用于Y寄存器。有效地址由地址$00FE的{​​little-endian}内容和$00FF形成,Y被添加到该地址。

您将$2000存储在这两个页面零位置,Y保留7,因此有效地址为$2007,超出了您要访问的三个字节数据

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

LDA $2000,Y

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

答案 2 :(得分:2)

不,你不正确。您错过了使用indirect indexed(而不是索引间接)寻址模式的LDA ($FE),Y的含义。间接意味着括号内的值是16位指针的地址,首先是低字节。这是您之前设置的$ 00和$ 20,所以2000美元。

索引是用Y完成的,你的循环退出条件是基于Y的,所以你有。 A的值是读取的最后一个值,所以你也有。

但是你的评论&关于风向标的问题的答案是非常相关的。由于CMP #$2F以及后续BPLINX,其他内存位置中的值很重要。 CMP的作用类似于减法,并且如果比较寄存器< N,则设置N标志。比较记忆; see here

因此X的值取决于其他内存值。