为什么ASM 6502中的条件分支限制为128个字节

时间:2015-10-03 01:01:41

标签: assembly branch 6502

例程必须在发出的分支指令的128或-127字节内的硬件原因是什么?

2 个答案:

答案 0 :(得分:11)

硬件原因有两方面:

  • 首先,6502是一个8位处理器,这意味着单个字节可以保存 无符号值从0到255,或者如果第7位用于表示符号(两个补码)则为-128 至+127。

  • 第二,Chuck Peddle将分支指令设计为双字节操作 - 第一个字节表示分支条件(操作码),第二个字节表示分支条件(操作码) 如果条件为真,则添加到程序计数器[PC]的有符号偏移值(操作数)。

现在很明显,使用单个有符号偏移字节作为分支操作数意味着最大的跳跃' BRx指令可以容纳的范围是从当前PC返回的128个位置,或者前面的127个位置。

如果您需要分支(而不是 jump ,见下文),则在范围允许的范围内,可以克服此限制很麻烦;然而,6502汇编编程技术的实践和经验以及对代码流程和组织的深刻理解通常会允许巧妙的设计,避免分支更远的距离。

CPU体系结构通过使BRx成为一个非常快的指令来补偿范围限制 - 如果不采用分支则只有2个周期,如果是,则只需要一个周期(即2个周期读取)操作码和操作数,并在内部寄存器中设置比较掩码,如果条件为真,则再将操作数添加到PC中。)

相比之下,JMP指令允许程序流在16位地址范围内的任何地方跳转,因为它使用双字节地址操作数 - 但是表现出平坦的3周期成本并且是无条件的。使用JMP仔细构建跳转表或自修改代码并通过分支编制索引,可以让程序员充分利用BRx的速度和条件,并且只会产生远距离跳跃&#39 ;条件成立时的成本。

答案 1 :(得分:5)

这是因为条件分支语句只有2个字节长,第一个字节是指令的操作码,第二个字节是带符号(二进制补码)值,用于标记到分支地址的距离如果条件为真。 (我相信值是DestinationAddress - AddressImmediatelyFollowingBranchStatement)。如果有两个补码且只有一个字节可用,则到目标地址的距离限制在以下范围内:[ - 128,+ 127]。

简而言之,因为6502的设计者只提供了两个补码中的单个带符号字节作为条件分支语句的参数。