我一直在研究 Game Boy 模拟器,我注意到存在某些永远不会改变任何值的操作码,例如LD A, A
,LD B, B
等,还有AND A
. 第一个显然不会改变任何东西,因为它们将寄存器的值加载到相同的寄存器中,并且由于AND
正在与A
寄存器进行比较,因此AND A
将始终返回A
。这些操作是否有任何目的,或者与NOP
每个周期后基本相同?
问问题
2293 次
3 回答
13
正如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
于 2014-10-20T02:10:56.573 回答
7
LD A,A
和之类的指令AND A
可能看起来是NOP
s,但它们也可能会更改处理器标志并用于测试寄存器的值。
请务必仔细检查指令集文档以了解此类副作用。
于 2014-10-19T02:46:39.653 回答
3
(以及)指令实际上是有目的的——它在为零时设置标志,否则清除。因此,两者都经常用于此目的。AND A
OR A
Z
A
AND A
OR A
于 2014-11-08T16:27:04.193 回答