6502间接访问模式

时间:2017-11-06 21:17:48

标签: 6502

我的问题是关于6502汇编语言。我试图使用这个网站https://skilldrick.github.io/easy6502/来学习它。

关于寻址模式的主题。我不了解间接寻址模式。请参阅下面的源代码示例。

LDA #$01
STA $f0
LDA #$cc
STA $f1
JMP ($00f0) ;dereferences to $cc01

为什么JMP ($00f0)取消引用$cc01代替$01cc

我的记忆看起来像这样

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

在这里,您看到00f001开头,然后是cc,因此我认为跳转说明会取消引用$01cc更符合逻辑,但为什么是这种方式有所逆转?

2 个答案:

答案 0 :(得分:4)

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

00f0: 01 
00f1: cc

JMP指令将f0处的字节加载到目标地址的低字节,将f1处的字节加载到目标地址的高字节,这意味着您跳转到{{ 1}}。

答案 1 :(得分:3)

关于“为什么这是以某种方式反转?”的另一个答案:小端遵循进位运行的方向,因此实施起来更便宜。在获得所有信息之前,您有足够的信息开始进行算术运算。

这是处理$aabb, X指令时6502的循环细分:

  1. 获取指令
  2. 获取操作数地址的低字节
  3. 将操作数地址的低字节添加到X寄存器,获取操作数地址的高字节
  4. 从具有高字节$ aa和低字节$ bb + X的地址读取,如果有携带然后计算$ aa + 1暂时使用...
  5. 如果有携带然后从适当的地址读取
  6. 因此,如果那是LDA,那么如果你没有越过页面边界,那么成本是四个周期,如果你这样做,那么就是五个周期。现在想象地址以大端格式存储。然后:

    1. 获取指令
    2. 获取操作数地址的高字节
    3. 获取操作数地址的低字节
    4. 将X添加到操作数地址的低字节
    5. 从具有高字节$ aa和低字节$ bb + X的地址读取,如果有携带然后计算$ aa + 1暂时使用...
    6. 如果有携带然后从适当的地址读取
    7. 所以你通过一个周期增加了成本。在你有低字节之前你不能开始,并且你在一个循环之后得到低字节。

      因此,如果您不安排事情以便首先获取最低字节,那么您将浪费时间。