我在使用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方式加载存储在内存地址中的值:
$FE
值(最初为00)这是对的吗?我错过了什么吗?
如果我不是,我在哪里使用2000
2001
和2002
中存储的值?
提前致谢..
答案 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
以及后续BPL
和INX
,其他内存位置中的值很重要。 CMP的作用类似于减法,并且如果比较寄存器< N,则设置N标志。比较记忆; see here
因此X的值取决于其他内存值。