6502间接寻址模式

4
我的问题与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,但为什么它会被反过来呢?

6
6502是小端序的。 - Raymond Chen
1
有两种人。一种是懂得字节序的,另一种不懂。 - Nick Westgate
2个回答

6

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

00f0: 01 
00f1: cc

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


4
在“为什么会有这种反转现象?”的问题上,另一个答案是:小端序遵循进位运行的方向,因此实现成本更低。你拥有足够的信息,在获得所有信息之前就可以开始进行算术运算。
下面是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. 如果有进位,则从正确的地址读取

这样一来,你增加了一个周期的成本。你必须等到获取低字节后才能开始执行,并且你要在一个周期后才能获取低字节。

因此,如果你不安排好先获取最低字节,那么你就会浪费时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接