6502 间接寻址问题
6502 indirect addressing issues
我在使用 6502 机器的以下代码时遇到了一些问题:
C000 LDA #[=10=]
C002 STA $FE
C004 LDA #
C006 STA $FF
C008 LDY #
C00A LDX #[=10=]
C00C DEY
C00D CPY #$FF
C00F BEQ $C01B
C011 LDA ($FE),Y
C013 CMP #F
C015 BPL $C00C
C017 INX
C018 JMP $C00C
C01B BRK
练习题是从地址2000开始存储数字2、1、4,并说出A、X、Y的值是多少
我 "running" 我用笔和纸写代码,但我卡在了 C011,原因如下:
LDA ($FE),Y
它在 A 中加载存储在以这种方式计算的内存地址中的值:
- 选择
$FE
值(一开始是00)
- 添加 Y 的值(第一次迭代时为 7)
- 我现在有 07
- 用存储在 07 的值加载 A
这是正确的吗?我错过了什么吗?
如果我不是,我在哪里使用存储在 2000
2001
和 2002
中的值?
提前致谢..
pick $FE value (that at first is 00)
实际上,它从$FE
加载一个16位的值,然后将该值加上Y
得到有效地址。
您已将 [=12=]
存储在 $FE
并将 </code> 存储在 <code>$FF
,因此从 $FE
加载的 16 位值将是 00
where do I use the values stored in 2000 2001 and 2002
当 Y
的值为 0、1 和 2 时。循环将继续,直到 Y
从 0 循环到 $FF。
参见 “10) Post-索引间接” 6502.txt。
这种寻址方式称为post-indexed indirect,仅用于Y
寄存器。有效地址由地址 [=12=]FE
和 [=13=]FF
的(小端)内容构成,并且 Y
添加到该地址。
您将 00
存储在这两个零页位置,并且 Y
存储 7
因此有效地址是 07
,超出了您希望的三个字节数据访问。
请注意,可以直接访问数组
LDA 00,Y
但间接方法的优点是您不需要提前知道地址,例如您可以 select 根据 运行- 要索引的几个表之一时间条件。
不,你不对。您错过了 LDA ($FE),Y
的含义,它使用 indirect indexed (而不是索引间接)寻址模式。间接表示括号内的值是一个 16 位指针的地址,低字节在前。那是你之前设置的 $00 和 $20,所以 $2000。
索引是用 Y 完成的,你的循环退出条件是基于 Y 的,所以你有那个。 A 的值是最后读取的值,所以你也有。
但是您对 Weather Vane 的回答的评论和问题非常相关。由于 CMP #F
以及随后的 BPL
和 INX
,其他内存位置中的值很重要。 CMP 就像一个减法,如果比较寄存器 < 比较内存,则设置 N 标志; see here.
所以 X 的值取决于其他内存值。
我在使用 6502 机器的以下代码时遇到了一些问题:
C000 LDA #[=10=]
C002 STA $FE
C004 LDA #
C006 STA $FF
C008 LDY #
C00A LDX #[=10=]
C00C DEY
C00D CPY #$FF
C00F BEQ $C01B
C011 LDA ($FE),Y
C013 CMP #F
C015 BPL $C00C
C017 INX
C018 JMP $C00C
C01B BRK
练习题是从地址2000开始存储数字2、1、4,并说出A、X、Y的值是多少
我 "running" 我用笔和纸写代码,但我卡在了 C011,原因如下:
LDA ($FE),Y
它在 A 中加载存储在以这种方式计算的内存地址中的值:
- 选择
$FE
值(一开始是00) - 添加 Y 的值(第一次迭代时为 7)
- 我现在有 07
- 用存储在 07 的值加载 A
这是正确的吗?我错过了什么吗?
如果我不是,我在哪里使用存储在 2000
2001
和 2002
中的值?
提前致谢..
pick $FE value (that at first is 00)
实际上,它从$FE
加载一个16位的值,然后将该值加上Y
得到有效地址。
您已将 [=12=]
存储在 $FE
并将 </code> 存储在 <code>$FF
,因此从 $FE
加载的 16 位值将是 00
where do I use the values stored in 2000 2001 and 2002
当 Y
的值为 0、1 和 2 时。循环将继续,直到 Y
从 0 循环到 $FF。
参见 “10) Post-索引间接” 6502.txt。
这种寻址方式称为post-indexed indirect,仅用于Y
寄存器。有效地址由地址 [=12=]FE
和 [=13=]FF
的(小端)内容构成,并且 Y
添加到该地址。
您将 00
存储在这两个零页位置,并且 Y
存储 7
因此有效地址是 07
,超出了您希望的三个字节数据访问。
请注意,可以直接访问数组
LDA 00,Y
但间接方法的优点是您不需要提前知道地址,例如您可以 select 根据 运行- 要索引的几个表之一时间条件。
不,你不对。您错过了 LDA ($FE),Y
的含义,它使用 indirect indexed (而不是索引间接)寻址模式。间接表示括号内的值是一个 16 位指针的地址,低字节在前。那是你之前设置的 $00 和 $20,所以 $2000。
索引是用 Y 完成的,你的循环退出条件是基于 Y 的,所以你有那个。 A 的值是最后读取的值,所以你也有。
但是您对 Weather Vane 的回答的评论和问题非常相关。由于 CMP #F
以及随后的 BPL
和 INX
,其他内存位置中的值很重要。 CMP 就像一个减法,如果比较寄存器 < 比较内存,则设置 N 标志; see here.
所以 X 的值取决于其他内存值。