Ich habe an einem Gameboy-Emulator gearbeitet, und mir ist aufgefallen, dass es bestimmte Opcodes gibt, die niemals Werte ändern würden, wie LD A, A
, LD B, B
usw. und auch AND A
. Die ersten ändern offensichtlich nichts, da sie den Wert von Registern in dieselben Register laden, und da AND
mit dem A
Register verglichen wird, gibt AND A
immer A
zurück. Gibt es einen Zweck für diese Operationen, oder sind sie nach jedem Zyklus im Wesentlichen identisch mit NOP
?
Als Jeffrey Bosboom und Hans Passant wies auf ihre Kommentare, der Grund ist Einfachheit . Genauer gesagt Hardware-Einfachheit.
Die Anweisungen LD r,r'
kopieren den Inhalt des Quellregisters ( r'
) in das Zielregister ( r
). LD r,r'
opcodes folgen dieser Form:
Ziel- und Quellregister können diese Werte annehmen:
%Vor%Um diese Anweisungen in Hardware zu implementieren, brauchen wir nur einen Multiplexer, der die Bits 0-2 empfängt, um das Quellenregister auszuwählen, und einen anderen Multiplexer, der die Bits 3-5 empfängt, um das Zielregister auszuwählen.
Wenn Sie überprüfen möchten, ob die Bits 0-2 und die Bits 3-5 auf dasselbe Register zeigen, müssten Sie der CPU mehr Logik hinzufügen. Und wie wir alle wissen, waren Ressourcen in den 80er Jahren begrenzter: P
Bitte beachten Sie, dass Ladeanweisungen wie LD A,A
, LD B,B
, LD C,C
, LD D,D
, LD E,E
, LD H,H
und LD L,L
sich wie NOP
verhalten. % Co_de% und AND A
DO NOT verhalten sich jedoch wie OR A
, da sie sich auf das Flag-Register auswirken und deren Ausführung möglicherweise den internen Maschinenzustand ändert.