我一直在研究Gameboy模拟器,我注意到存在一些永远不会改变任何值的操作码,例如LD A, A
,LD B, B
等等。 AND A
。第一个显然没有改变任何东西,因为它们将寄存器的值加载到相同的寄存器中,并且由于AND
正在与A
寄存器进行比较,AND A
将始终返回{ {1}}。这些操作是否有任何目的,或者在每个循环后与A
基本相同?
答案 0 :(得分:10)
由于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
和{{1}等说明表现得像LD L,L
。但是NOP
和AND A
不要的行为与OR A
相同,因为它们会影响标记寄存器,并且它们的执行可能会改变内部机器状态。
答案 1 :(得分:6)
LD A,A
和AND A
等指令似乎可能是NOP
,但它们也可能会更改处理器标志并用于测试寄存器的值。
请务必仔细检查说明书文档以了解此类副作用。
答案 2 :(得分:2)
实际上是AND A
(以及OR A
)指令的目的 - 当Z
为零时,它会设置标记A
否则就会清除。因此,AND A
和OR A
经常用于此目的。