【问题标题】:How does a branch instruction work on the 6502 with a relative offset of 0x00 (fetch / execute cycle)?相对偏移量为 0x00(获取/执行周期)的 6502 上的分支指令如何工作?
【发布时间】:2020-01-10 23:26:46
【问题描述】:

编辑:我没有使用任何调试器,因为我不打算安装任何软件,但我们不胜感激

假设我们偶然发现了指令 BPL $0x00

基地址(PC):0x400 值:BPL $00

直觉上可能会假设程序将在地址 0x400 处挂起。

但是,我更倾向于说,它会首先获取 0x400 处的操作码,递增 PC,解码它需要读取操作数,获取操作数,递增 PC。

这让我们在地址 0x402。届时,处理器将解码指令和操作码并在获取下一个操作码之前执行。

那么最终会发生什么?程序是跳转到地址 0x400,还是像我预测的那样跳转到地址 0x402?

【问题讨论】:

  • 它只是增加了 PC 的价值,所以正如你预测的那样是 402 美元。

标签: 6502


【解决方案1】:

如前所述,偏移量被添加到指令后面的地址,因此偏移量 00 使分支指令在分支为真时不添加任何内容。但是请注意,NULL 分支确实会对代码执行产生影响,尽管涉及时间的影响很小,因为执行的分支需要三个周期才能完成,而跳过的分支只需要两个周期。

LDA #45
BPL +00 ; branch taken, execution time 3 clock cycles
LDA #FE 
BPL +00 ; branch skipped, execution time 2 clock cycles

所有这些信息都在 6500 编程手册,http://6502.org/documents/books/mcs6500_family_programming_manual.pdf,第 40-45 页中提供。

【讨论】:

    【解决方案2】:

    分支指令(如果为真)将给定参数添加到 PC。如您所料,在您的程序中,命令分支到 0x402。

    使用类似页面http://skilldrick.github.io/easy6502/ 的简单模拟器,您可以测试行为:

      LDA #$F1
    label:
      BPL label
      LDA #$01
      BPL label2
    label2:
      BRK
    

    反汇编结果:

    Address  Hexdump   Dissassembly
    -------------------------------
    $0600    a9 f1     LDA #$f1
    $0602    10 fe     BPL $0602
    $0604    a9 01     LDA #$01
    $0606    10 00     BPL $0608
    $0608    00        BRK 
    

    因此,如您所见,带有参数 0x00 的十六进制代码 0x10 (BPL) 只是转到下一条指令(此处指向 0608 处的地址)。

    【讨论】:

      猜你喜欢
      • 2014-01-22
      • 2018-06-26
      • 2023-01-08
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多