我一直在研究 Game Boy 模拟器,我注意到存在某些永远不会改变任何值的操作码,例如 LD A, A
, LD B, B
等,还有 AND A
.第一个显然不会改变任何东西,因为它们将寄存器的值加载到相同的寄存器中,并且因为 AND
正在与A
进行比较注册,AND A
将永远返回 A
.这些操作有什么目的吗,或者和NOP
本质上是一样的每个周期后?
最佳答案
如 Jeffrey Bosboom和 Hans Passant在他们的评论中指出,原因是简单 .更具体地说,硬件简单。LD r,r'
指令将源寄存器( r'
)的内容复制到目标寄存器( r
)。 LD r,r'
操作码遵循以下形式:
-------------------------------
BIT | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
-------------------------------
OPCODE | 0 | 1 | r | r' |
-------------------------------
目标和源寄存器可以采用以下值:
-----------
| BIT | REG |
-----------
| 111 | A |
-----------
| 000 | B |
-----------
| 001 | C |
-----------
| 010 | D |
-----------
| 011 | E |
-----------
| 100 | H |
-----------
| 101 | L |
-----------
为了在硬件中实现这些指令,我们只需要一个接收位 0-2 以选择源寄存器的多路复用器和另一个接收位 3-5 以选择目标寄存器的多路复用器。
如果要验证位 0-2 和位 3-5 是否指向同一个寄存器,则必须向 CPU 添加更多逻辑。众所周知,资源在 80 年代更为有限:P
请注意加载说明如
LD A,A
, LD B,B
, LD C,C
, LD D,D
, LD E,E
, LD H,H
, 和 LD L,L
表现得像 NOP
.然而AND A
和 OR A
不要表现得像 NOP
,因为它们会影响标志寄存器,并且它们的执行可能会改变内部机器状态。
关于emulation - 游戏男孩 : What is the purpose of instructions that don't modify anything (e. g。和 A)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26416839/