分支指令如何在相对偏移量为 0x00(获取/执行周期)的 6502 上工作?
How does a branch instruction work on the 6502 with a relative offset of 0x00 (fetch / execute cycle)?
编辑:我没有使用任何调试器,因为我不打算安装任何软件,但建议表示赞赏
假设我们偶然发现指令 BPL $0x00
基地址(PC):0x400 值:BPL $00
直觉上人们可能会假设程序将挂在地址 0x400。
不过,我更倾向于说,它会先取0x400处的操作码,PC递增,解码需要读取一个操作数,取操作数,PC递增。
这使我们处于地址 0x402。到那时处理器将解码指令和操作码并在获取下一个操作码之前执行。
那么最后会发生什么?程序是分支到地址 0x400,还是像我预测的那样分支到地址 0x402?
分支指令(如果为真)将给定参数添加到 PC。在您的程序中,命令分支到 0x402,正如您预测的那样。
使用 http://skilldrick.github.io/easy6502/ 页上的简单模拟器,您可以测试行为:
LDA #$F1
label:
BPL label
LDA #
BPL label2
label2:
BRK
反汇编结果:
Address Hexdump Dissassembly
-------------------------------
00 a9 f1 LDA #$f1
02 10 fe BPL 02
04 a9 01 LDA #
06 10 00 BPL 08
08 00 BRK
因此,如您所见,参数为 0x00 的十六进制代码 0x10 (BPL) 将转到下一条指令(此处为 0608 地址)。
如前所述,偏移量被添加到指令后面的地址,因此偏移量 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 页中提供。
编辑:我没有使用任何调试器,因为我不打算安装任何软件,但建议表示赞赏
假设我们偶然发现指令 BPL $0x00
基地址(PC):0x400 值:BPL $00
直觉上人们可能会假设程序将挂在地址 0x400。
不过,我更倾向于说,它会先取0x400处的操作码,PC递增,解码需要读取一个操作数,取操作数,PC递增。
这使我们处于地址 0x402。到那时处理器将解码指令和操作码并在获取下一个操作码之前执行。
那么最后会发生什么?程序是分支到地址 0x400,还是像我预测的那样分支到地址 0x402?
分支指令(如果为真)将给定参数添加到 PC。在您的程序中,命令分支到 0x402,正如您预测的那样。
使用 http://skilldrick.github.io/easy6502/ 页上的简单模拟器,您可以测试行为:
LDA #$F1
label:
BPL label
LDA #
BPL label2
label2:
BRK
反汇编结果:
Address Hexdump Dissassembly
-------------------------------
00 a9 f1 LDA #$f1
02 10 fe BPL 02
04 a9 01 LDA #
06 10 00 BPL 08
08 00 BRK
因此,如您所见,参数为 0x00 的十六进制代码 0x10 (BPL) 将转到下一条指令(此处为 0608 地址)。
如前所述,偏移量被添加到指令后面的地址,因此偏移量 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 页中提供。