>编辑:我没有使用任何调试器,因为我不打算安装任何软件,但建议不胜感激
假设我们偶然发现了 BPL $0x00 的指令
基址(电脑(: 0x400 价值: BPL $00
直觉上,人们可能会假设该程序将在地址0x400挂起。
但是,我更倾向于说,它将首先在0x400处获取操作码,递增PC,解码它需要读取操作数,获取操作数,递增PC。
这就剩下地址0x402了。届时,处理器将解码指令和操作码,并在获取下一个操作码之前执行。
那么最终会发生什么呢? 程序分支是为了解决0x400,还是像我预测的那样分支来解决0x402?
如前所述,偏移量将添加到指令后面的地址,因此如果分支为真,偏移量 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页中提供。
分支指令(如果为真(将给定的参数添加到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处寻址(。