分支指令如何在相对偏移量为 0x00(获取/执行周期)的 6502 上工作?



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

假设我们偶然发现了 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处寻址(。

最新更新