我的问题是关于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
在这里,您看到00f0
以01
开头,然后是cc
,因此我认为跳转说明会取消引用$01cc
更符合逻辑,但为什么是这种方式有所逆转?
答案 0 :(得分:4)
6502是小端。这意味着对于16位值,其占用两个字节,最低字节存储在最低地址。在两个STA
之后,你有:
00f0: 01
00f1: cc
JMP
指令将f0
处的字节加载到目标地址的低字节,将f1
处的字节加载到目标地址的高字节,这意味着您跳转到{{ 1}}。
答案 1 :(得分:3)
关于“为什么这是以某种方式反转?”的另一个答案:小端遵循进位运行的方向,因此实施起来更便宜。在获得所有信息之前,您有足够的信息开始进行算术运算。
这是处理$aabb, X
指令时6502的循环细分:
因此,如果那是LDA
,那么如果你没有越过页面边界,那么成本是四个周期,如果你这样做,那么就是五个周期。现在想象地址以大端格式存储。然后:
所以你通过一个周期增加了成本。在你有低字节之前你不能开始,并且你在一个循环之后得到低字节。
因此,如果您不安排事情以便首先获取最低字节,那么您将浪费时间。