169. 指令 bmi

实现“负数时分支”行为。

169 / 356 · tests/chapter_01_cpu/test_169_instruction_bmi.py

为什么需要这一步

“负数(minus)”意味着此前某次运算结果所置位的负数标志,因此 BMI 只读取该状态,而不重新计算它。

在这一步中,只需添加以下实现

`emulator/cpu/instructions.py::bmi`::

def bmi(cpu: CPU, offset: int):
    if cpu.flags.get_negative_flag():
        cpu.pc = (cpu.pc + offset) & 0xFFFF

BMI 把已经解码好的带符号位移应用到其操作数之后的 PC 上,并将目标地址掩码限制在 16 位以内。

不变量:负数标志置位时发生分支,负数标志清零时 PC 保持不变;标志位、其他寄存器和内存均不受影响。常见误解:BMI 不检查 `offset` 的符号,也不通过运算来确定负数标志。

超出范围:BVC/BVS 属于第 170-171 课。导入到 `emulator/cpu/opcodes.py`、相对寻址处理函数以及操作码表项属于第 172-179 课。

运行本课

uv run pytest tests/chapter_01_cpu/test_169_instruction_bmi.py -v