6502 间接访问模式

6502 Indirect acces mode

我的问题是关于 6502 汇编语言的。我正在尝试使用此网站学习它 https://skilldrick.github.io/easy6502/

关于寻址模式的话题。我不明白间接寻址模式。请参阅下面的源代码示例。

LDA #
STA $f0
LDA #$cc
STA $f1
JMP ([=10=]f0) ;dereferences to $cc01

为什么 JMP ([=11=]f0) 被取消引用为 $cc01 而不是 cc

我的记忆是这样的

00f0: 01 cc 00 00 00 00 00 00 00 00 00 00 00 00 84

这里你看到 00f001 开头,然后是 cc,所以在我看来跳转指令将取消引用 cc 更合乎逻辑,但是为什么这会以某种方式逆转?

6502 是小端。这意味着对于占用两个字节的 16 位值,最低字节存储在最低地址。在两个 STA 之后,您有:

00f0: 01 
00f1: cc

JMP 指令将 f0 处的字节加载到目标地址的低字节,并将 f1 处的字节加载到目标地址的高字节,这意味着你跳转到cc01

关于“为什么 这会以某种方式颠倒过来?”的附加答案:小端遵循进位运行的方向,因此实施起来更便宜。在你掌握所有信息之前,你已经有足够的信息开始做算术了。

这是6502在处理一条$aabb, X指令时的循环分解:

  1. 获取指令
  2. 获取操作数地址的低字节
  3. 将操作数地址低字节加入X寄存器,取操作数地址高字节
  4. 从地址读取高字节$aa,低字节$bb + X,如果有进位则计算出$aa+1,待会儿使用...
  5. 如果有进位则从正确的地址读取

因此,如果那是 LDA,那么如果您不跨越页面边界,则成本为四个周期,如果跨越则为五个。现在想象地址以大端格式存储。那么:

  1. 获取指令
  2. 获取操作数地址的高字节
  3. 获取操作数地址的低字节
  4. 将X加到操作数地址的低字节
  5. 从地址读取高字节$aa,低字节$bb + X,如果有进位则计算出$aa+1,待会儿使用...
  6. 如果有进位则从正确的地址读取

所以你增加了一个周期的成本。拿到低字节后才能开始,一个周期后才拿到低字节。

因此,如果您不安排首先获取最低字节,那么您就是在浪费时间。