编辑:我没有使用任何调试器,因为我不打算安装任何软件,但建议值得赞赏
假设我们偶然发现指令 BPL $0x00
基地址(PC):0x400 值:BPL $00
凭直觉,人们可能会认为程序将挂在地址 0x400 处。
然而,我更倾向于说,它会首先获取 0x400 处的操作码,递增 PC,解码它需要读取操作数,获取操作数,递增 PC。
这样我们就到达了地址 0x402。届时,处理器将解码指令和操作码并在获取下一个操作码之前执行。
那么最终会发生什么呢?程序是分支到地址 0x400,还是像我预测的那样分支到地址 0x402?
小智 5
正如已经评论过的,偏移量被添加到指令后面的地址,因此如果分支为真,偏移量为 00 会使分支指令不添加任何内容。但是请注意,NULL 分支确实对代码执行有影响,尽管涉及时序的影响很小,因为执行的分支需要三个周期才能完成,而跳过的分支只需要两个周期。
LDA #45
BPL +00 ; branch taken, execution time 3 clock cycles
LDA #FE
BPL +00 ; branch skipped, execution time 2 clock cycles
Run Code Online (Sandbox Code Playgroud)
所有这些信息都在 6500 编程手册中提供,http://6502.org/documents/books/mcs6500_family_programming_manual.pdf,第 40-45 页。