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

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

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

...

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

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

Z80._r.a = Z80._r.a

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

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

2 ответа

Решение

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

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 против 0 создает LD B,B) и верхние два бита 01 выберите LD, не уверен с первого взгляда, если я расшифровал это отлично.

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

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

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

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


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

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

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

MOV AL,AL и т. Д.

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

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

Другие вопросы по тегам