Какова цель инструкций по загрузке регистра для себя?

Просматривая набор команд Gameboy, я столкнулся с такими инструкциями, как:

LD A, A
LD B, B
LD C, C
LD B, B

...

Каждая из этих инструкций имеет собственный код операции в этой таблице, что заставляет меня думать, что они имеют некоторое значение из-за ограничений на количество возможных кодов операций.

Сначала я подумал, что это может быть разыменование указателя в этом регистре и сохранение значения в этом указателе (как в этом вопросе), но в эмуляторе LD A, A реализуется как:

Z80._r.a = Z80._r.a

Они, похоже, не влияют на состояние процессора (просто устанавливают регистры на свое значение) и принимают такое же количество циклов, что и NOP для выполнения.

Почему эти коды операций включены в набор инструкций и с какой целью они служат?

Ответ 1

Они упрощают блок декодирования, если вы проверите

7F LD A,A
78 LD A,B
79 LD A,C

против

47 LD B,A
40 LD B,B
41 LD B,C

против

4F LD C,A
48 LD C,B
49 LD C,C

Вы можете заметить, что нижние 3 бита зарезервированы для исходного регистра (значения 0-7, идущие в B,C,D,E,H,L,(HL),A), 3 бита рядом с ними являются целевым регистром, то же значение 0-7 (таким образом, 0 vs 0 создает LD B,B), а верхние два бита 01 выбирают LD, не уверен в быстром взгляде, если я его полностью расшифровал.

Можно также ожидать, что 76 будет LD (HL),(HL), что делает еще меньше смысла, чем LD A,A, поэтому существует специальная логика, чтобы поймать эту и сделать HALT вместо этого.

Таким образом, это касается простоты декодера команд, используя одни и те же битовые шаблоны для выбора регистров источника/цели и не добавляя больше транзисторов, чтобы поймать same,same ситуации, за исключением (HL),(HL) (который, возможно, как источник, так и цель, требующие доступа к памяти, поэтому, возможно, дополнительная "логика" довольно проста в дизайне HW.

Имейте в виду, что ранние процессоры часто разрабатывались вручную, и количество всех транзисторов должно было оставаться низким как для установки на чипе, так и для управления схемой вручную и проверки ее правильности.

EDIT: Z80 имеет около 8500 транзисторов, вы можете проверить: https://en.wikipedia.org/wiki/Transistor_count и https://en.wikipedia.org/wiki/Zilog_Z80... и у GameBoy немного модифицированный Z80, но количество суммарных транзисторов будет очень близким к исходному значению, хотя я не искал точное значение, и я не уверен, насколько далеко в будущем Nintendo расширяет его, возможно, они могли бы пусть даже собирается что-то вроде 20-50k уже, но я в этом сомневаюсь.


Добавление: в последнее время я читал о российских клонах Sinclair ZX Spectrum, которые были сильно модифицированными машинами, добавляя дополнительную мощность, память и возможности... И некоторые из них используют эти ld same,same коды операций для управления передачами DMA, поэтому на этих коды машин, использующие их как nop, вероятно, не будут выполнены должным образом. Это не относится к GameBoy, но в случае, если у вас есть бинарная цель одного из "Спринтеров" или подобных русских ZX-клонов, и вы обнаружите один из них при разборке, не считайте их автоматически nop, они могут быть частью эффективного кода на самом деле что-то (скорее всего, с DMA).

Ответ 2

Эти любопытные инструкции NOP полностью возвращаются к первоначальному процессору-предшественнику Intel 8008. В этом чипе они были всего лишь результатом реализации инструкции перемещения регистров. Разрешение MOV A, A и т.д. Упростило декодер команд и сохранили силиконовое пространство.

Начиная с 8080 до Z80 (и далее), они стали необходимыми для обеспечения обратной совместимости. Они даже выжили в мире x86 в форме

MOV AL, AL и т.д.

Поэтому большинство современных настольных компьютеров по-прежнему поддерживают эти нечетные инструкции.

Примечание. Я использую мнемонику Intel при описании машин Intel. Будьте уверены, что они собираются до того же двоичного кода, что и мнемоника Zilog.