【问题标题】:Why does conditional branching in ASM 6502 have limit of 128 bytes为什么 ASM 6502 中的条件分支限制为 128 个字节
【发布时间】:2015-10-03 01:01:40
【问题描述】:

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

【问题讨论】:

  • 简单:偏移量使用 8 位有符号数编码。
  • 要绕过此限制,请反转条件跳转的含义,使其跳过跳转指令到超过 127 字节之外的位置。一些汇编器有一个条件分支宏可以做到这一点,但我不知道是否有任何 6502 汇编器有这种类型的宏。

标签: assembly branch 6502


【解决方案1】:

硬件原因有两个:

  • 首先,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 的速度和条件,并且仅在条件为真时产生“远跳转”成本。

【讨论】:

  • 克服这个限制可以像转动一样简单,例如BEQ labelBNE 3; JMP label 如果 label 不适合有符号的 8 位范围。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多