首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >6502间接存取模式

6502间接存取模式
EN

Stack Overflow用户
提问于 2017-11-06 21:17:47
回答 2查看 401关注 0票数 4

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

关于称谓方式的话题。我不明白间接称谓的方式。请参阅下面的源代码示例。

代码语言:javascript
复制
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的引用更符合逻辑,但是为什么这种情况会被逆转呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-07 10:59:57

6502是小安迪安。这意味着对于16位值,这需要两个字节,最低字节存储在最低的地址。在这两个STAs之后,您有:

代码语言:javascript
复制
00f0: 01 
00f1: cc

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

票数 6
EN

Stack Overflow用户

发布于 2017-11-07 15:06:12

另一个答案是“为什么这种情况会发生逆转?”:小endian遵循进位运行的方向,因此执行起来更便宜。在得到所有信息之前,您有足够的信息开始算术。

这是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. 如果有进位,那就从正确的地址读出来

所以你把成本增加了一个周期。你不能开始直到你有低字节,你得到低字节一个周期后。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47145954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档