13

我一直在研究 Game Boy 模拟器,我注意到存在某些永远不会改变任何值的操作码,例如LD A, A,LD B, B等,还有AND A. 第一个显然不会改变任何东西,因为它们将寄存器的值加载到相同的寄存器中,并且由于AND正在与A寄存器进行比较,因此AND A将始终返回A。这些操作是否有任何目的,或者与NOP每个周期后基本相同?

4

3 回答 3

13

正如Jeffrey BosboomHans 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,LNOPAND AOR A NOP

于 2014-10-20T02:10:56.573 回答
7

LD A,A和之类的指令AND A可能看起来是NOPs,但它们也可能会更改处理器标志并用于测试寄存器的值。

请务必仔细检查指令集文档以了解此类副作用。

于 2014-10-19T02:46:39.653 回答
3

(以及)指令实际上是有目的的——它在为零时设置标志,否则清除。因此,两者都经常用于此目的。AND AOR AZAAND AOR A

于 2014-11-08T16:27:04.193 回答