编程仿真器:仿真器如何理解地址中的操作码?

时间:2013-09-18 22:25:49

标签: assembly emulation opcode 6502

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

理解这些内容的最佳资源是The Elements of Computing Systems,这是一本书,但大部分内容都可以从该网站获得。

希望有所帮助。

答案 1 :(得分:1)

  

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

SNES的CPU基于the 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(物理偏移)中找到对应的ROM中的RESET向量取决于内存映射模式。)

存储在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..