Какова цель инструкции для загрузки реестра для себя? - PullRequest
0 голосов
/ 05 мая 2018

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

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

...

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

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

Z80._r.a = Z80._r.a

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

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

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

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

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

MOV AL, AL и т. Д.

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

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

0 голосов
/ 05 мая 2018

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

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-50k, но я сомневаюсь в этом.


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

...