【问题标题】:6502 Indirect acces mode6502 间接访问模式
【发布时间】:2017-11-06 21:17:47
【问题描述】:

我的问题是关于 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 的引用更合乎逻辑,但为什么这会以某种方式反转?

【问题讨论】:

标签: 6502


【解决方案1】:

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

00f0: 01 
00f1: cc

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

【讨论】:

    【解决方案2】:

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

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

    1. 获取指令
    2. 获取操作数地址的低字节
    3. 将操作数地址的低字节添加到X寄存器,获取操作数地址的高字节
    4. 从高字节$aa和低字节$bb + X的地址中读取,如果有进位则计算出$aa+1,待会使用...
    5. 如果有进位,则从正确的地址读取

    因此,如果那是LDA,那么如果您不跨越页面边界,则成本是四个周期,如果是,则成本是五个周期。现在想象一下地址以大端格式存储。那么:

    1. 获取指令
    2. 获取操作数地址的高字节
    3. 获取操作数地址的低字节
    4. 将 X 添加到操作数地址的低字节
    5. 从高字节$aa和低字节$bb + X的地址中读取,如果有进位则计算出$aa+1,待会使用...
    6. 如果有进位,则从正确的地址读取

    所以你增加了一个周期的成本。直到获得低字节后才能开始,并且在一个周期后获得低字节。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多