Eig*_*uru 11
硬件原因有两方面:
首先,6502是一个8位处理器,这意味着单个字节可以保存从0到255的无符号值,或者如果第7位用于表示符号(二进制补码),则表示-128到+127.
第二,Chuck Peddle将分支指令设计为双字节操作 - 第一个字节表示分支条件(操作码),第二个字节是一个有符号偏移值(操作数),如果条件为真,则添加到程序计数器[PC] .
如现在显而易见的,使用单个带符号的偏移字节作为分支操作数意味着BRx指令可以容纳的最大"跳跃"范围是从当前PC返回的128个位置,或者前面的127个位置.
在需要分支(而不是跳转,见下文)的情况下,这个限制可能很难克服,范围允许; 然而,6502汇编编程技术的实践和经验以及对代码流程和组织的深刻理解通常会允许巧妙的设计,避免分支更远的距离.
CPU架构通过BRx一个令人难以置信的快速指令来补偿范围限制- 如果不采用分支则只有2个周期,如果是,则只需要一个周期(即2个周期来读取操作码和操作数并设置比较内部寄存器中的掩码,如果条件为真,则再将一个操作数添加到PC中.
JMP相比之下,该指令允许程序流在16位地址范围内的任何位置跳转,因为它使用双字节地址操作数 - 但是表现出平坦的3周期成本并且是无条件的.使用JMP分支并通过分支索引来仔细构造跳转表或自修改代码允许程序员利用速度和条件,BRx 并且当条件为真时仅产生"远程跳跃"成本.
这是因为条件分支语句只有2个字节长,第一个字节是指令的操作码,第二个字节是有符号(二进制补码)值,如果条件为真,则标记到地址分支的距离.(我相信值是DestinationAddress - AddressImmediatelyFollowingBranchStatement).使用两个补码且只有一个字节可用,到目标地址的距离限制为以下范围:[ - 128,+ 127].
简而言之,这是因为6502的设计者只提供了二进制补码中的单个带符号字节作为条件分支语句的参数.