我的问题是关于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的引用更符合逻辑,但是为什么这种情况会被逆转呢?
发布于 2017-11-07 10:59:57
6502是小安迪安。这意味着对于16位值,这需要两个字节,最低字节存储在最低的地址。在这两个STAs之后,您有:
00f0: 01
00f1: ccJMP指令将位于f0的字节加载到目标地址的低字节中,将f1的字节加载到目标地址的高字节中,这意味着您跳到了cc01。
发布于 2017-11-07 15:06:12
另一个答案是“为什么这种情况会发生逆转?”:小endian遵循进位运行的方向,因此执行起来更便宜。在得到所有信息之前,您有足够的信息开始算术。
这是6502在处理$aabb, X指令时的循环分解:
因此,如果这是LDA,那么如果您不跨越页面边界,则成本是四个周期,如果是的话,则是五个周期。现在假设地址是以大端字节格式存储的。然后:
所以你把成本增加了一个周期。你不能开始直到你有低字节,你得到低字节一个周期后。
因此,如果您不安排事情,以便首先获取最低字节,那么您正在浪费时间。
https://stackoverflow.com/questions/47145954
复制相似问题