Я работал над эмулятором Game Boy и заметил, что существуют определенные коды операций, которые никогда не изменяют никаких значений, например LD A, A
, LD B, B
и т. д., а также AND A
. Первые, очевидно, ничего не меняют, поскольку загружают значения регистров в те же регистры, а поскольку AND
сравнивается с A
, AND A
всегда будет возвращать A
. Есть ли какая-то цель для этих операций, или они по сути такие же, как NOP
после каждого цикла?
Game Boy: Какова цель инструкций, которые ничего не изменяют (например, AND A)?
Ответы (3)
Как Джеффри Босбум и Ханс Пассант указал на их комментарии, причина в простоте. Точнее аппаратная простота.
Инструкции 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 на один и тот же регистр, вам придется добавить больше логики в ЦП. И, как мы все знаем, в 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
, поскольку они влияют на регистр флагов, и их выполнение может изменить внутреннее состояние машины.
Такие инструкции, как LD A,A
и AND A
, могут выглядеть как NOP
, но они также могут изменять флаги процессора и использоваться для проверки значения регистра.
Обязательно внимательно изучите документацию по набору инструкций на наличие таких побочных эффектов.
AND A
— это идиоматический способ сравнения с нулем, если память не изменяет; это один байт, а не два, и в результате меньше циклов.
- person Tommy; 31.10.2014
LD r,r'
не меняет флаги.
- person Jongware; 05.06.2016
В инструкции AND A
(а также OR A
) на самом деле есть цель есть -- она устанавливает флаг Z
, когда A
равен нулю, и сбрасывает в противном случае. Поэтому для этой цели часто используются как AND A
, так и OR A
.
mov eax, eax
в x86: не стоило усложнять пространство кодирования, чтобы использовать эти кодировки для чего-то полезного. (Я недостаточно знаком с Game Boy или z80, чтобы сказать, есть ли у этих инструкций какие-либо скрытые микроархитектурные побочные эффекты, извините.) - person Jeffrey Bosboom   schedule 17.10.2014