2

我很难理解 SNES 如何理解什么是操作码以及什么是地址/参数。我知道每个操作码都由一个唯一的十六进制字节编码。它们是紧随其后的字节吗?如果是这样,它如何知道接收一个字节或两个字节(对于绝对地址或直接地址)。

如果是这种情况,这是否意味着文件的第一个字节(在标头之后)是一个操作码?

4

2 回答 2

3

处理器有一个 PC(程序计数器)寄存器,其中包含要执行的下一条指令的地址。复位时,PC 设置为开始执行的固定值。

每条指令的第一个字节是操作码字节;它的编码决定了指令将做什么以及需要多少操作数字节。处理器从 PC 中的地址中取出操作码字节并递增 PC。检查操作码并获取任何必要的操作数字节,总是从 PC 指向的内存中获取,每个内存都会递增。一旦获取一条完整的指令,PC 将指向下一条指令的操作码。

CPU然后执行由操作码字节及其操作数确定的操作,这称为指令执行。例如,在跳转的情况下,执行可能会改变 PC,但在执行结束时,PC 将指向下一条要执行的指令的操作码字节,并且循环(称为 fetch-execute 循环)继续。

程序中的错误通常是由于 PC 更改为不是程序员/编译器编写的指令的开头的值。CPU 无法知道这一点,并且无论如何都会继续执行,执行从未打算执行的内存内容并执行基本上随机的操作。

了解这一切如何组合在一起的一个极好的资源是The Elements of Computing Systems,这是一本书,但大部分内容都可以从该网站获得。

希望有帮助。

于 2013-09-19T03:32:28.540 回答
1

如果是这种情况,这是否意味着文件的第一个字节(在标头之后)是一个操作码?

SNES 的 CPU 基于65C816,这是 6502 的一种演变。为了向后兼容,65C816 包括与 6502(实际上是 65C02)二进制兼容的仿真模式。还有原生模式,你有 16 位寄存器和所有的爵士乐。

每种模式都有自己的向量表:

原生模式:

$FFE4: COP (co-processor interrupt)
$FFE6: BRK
$FFE8: ABORT
$FFEA: NMI (vertical blank)
$FFEC: - (no RESET in native mode)
$FFEE: IRQ

仿真模式:

$FFF4: COP
$FFF6: -
$FFF8: ABORT
$FFFA: NMI (vertical blank)
$FFFC: RESET
$FFFE: IRQ or BRK

当 CPU 复位时,它以仿真模式启动,并期望在逻辑地址$FFFC 处找到 RESET 向量( ROM 中对应的物理偏移量取决于内存映射模式)。

存储在 RESET 向量中的地址应指向您要在复位/电源循环后执行的第一段代码。通常它会从禁用中断开始,将 CPU 切换到本机模式,然后继续初始化系统的其余部分(图形处理器、声音处理器..):

sei    ; Disable interrupts
clc    ; Clear the carry flag 
xce    ; Swap the carry and emulation flag (i.e. clear the emulation flag)
...    ; Awesomeness follows..
于 2013-09-19T07:40:03.357 回答