182. JMP 绝对寻址

接入 JMP 绝对寻址操作码 $4C。

182 / 356 · tests/chapter_01_cpu/test_182_JMP_absolute.py

前置条件:第 181 步已添加 `jmp。在本步骤中,向 emulator/cpu/opcodes.py` 添加以下改动(包括导入和表项):

from emulator.cpu.instructions import jmp
from emulator.cpu.addressing_modes import absolute

def jmp_absolute(cpu: CPU):
    addr = absolute(cpu)
    jmp(cpu, addr)

OPCODE_TABLE = {
    # existing entries...
    0x4C: jmp_absolute,
}

操作码

0x4C -> JMP $hhhh

目标

创建 jmp_absolute(cpu),使用 absolute(cpu),然后调用 jmp(cpu, addr)。

学习指引

JMP 绝对寻址与 LDA 绝对寻址是不同的。

对于 LDA $1234:

A = memory[$1234]

对于 JMP $1234:

PC = $1234

因此该操作码的处理函数绝不能读取目标地址处的内存。绝对寻址的操作数本身就是新的 PC 值。

本步骤存在的原因

`absolute 消费两个小端序的操作数字节并返回其 16 位数值;jmp 负责将其赋给 PC。不变量:该步骤在替换 PC 前消费三个字节,保持标志位/寄存器/栈/内存不变,并且只映射 $4C。常见误解:与加载类处理函数不同,该处理函数绝不能读取 cpu.bus.read(addr)`。

本步骤范围之外:JMP 间接寻址与操作码 $6C 属于第 183 步;JSR 及其对栈的影响属于第 184-185 步。

运行本课

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