Почему у микроконтроллера 6502 нет арифметического сдвига вправо? - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь понять наборы команд старых микроконтроллеров, особенно 6502.

В документации по набору команд, которую можно найти здесь перечислены две инструкции сдвига (кромеинструкции поворота):

ASL - арифметический сдвиг влево

LSR - логический сдвиг вправо

Почему нет арифметический сдвиг вправо и логический сдвиг влево инструкции?

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

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Я всегда считал эту пару инструкций чем-то вроде мошенничества. На исходном 6502 нет арифметических сдвигов вообще. Арифметические сдвиги сохраняют знак смещаемого числа, и так называемый ASL делает это только благодаря тому факту, что 6502 использует дополнение 2.

Исходный 6502 имеет только две операции сдвига: сдвиг вправо и сдвиг влево со смещенным битом, идущим к флагу переноса, и смещенный бит при установке в ноль. Для сдвигов, оставленных с дополнением 2, нет различий между арифметическим и логическим. Однако, для сдвигов вправо, арифметический сдвиг должен сохранять знаковый бит. Это означает, что для этого вам понадобится схема для передачи верхнего бита входа в сдвиг к верхнему биту выхода и дополнительная управляющая линия для выбора между этим значением и 0. Для всех этих параметров требуется больше транзисторов, и арифметический сдвиг может быть смоделированным с вращением.

    CLC
    LDA number
    BPL positive
    SEC
positive:
    ROR A

Основной движущей силой дизайна 6502 было превзойти Motorola 6800 по более низкой цене. Это было сделано путем удаления из 6800 несущественных элементов, чтобы они могли сделать подсчет транзисторов как можно ниже. 6502 имеет количество транзисторов около 3500. Более ранние 6800 имеют количество транзисторов около 4500. Таким образом, были исключены несущественные признаки, такие как правильное арифметическое смещение.

На самом деле, учитывая, что смены можно эмулировать, сняв флаг переноса и затем сделав поворот, я удивлен, что они вообще с ними обеспокоены. Разработчики, должно быть, обнаружили, что могут добавлять инструкции сдвига с минимальным увеличением сложности, так же, как инструкция SBC точно такая же, как инструкции ADC, но с инвертированными битами второго операнда.

0 голосов
/ 03 марта 2019

Логический сдвиг влево такой же, как арифметический сдвиг влево, поэтому нет необходимости различать их. Многие ассемблеры для других платформ рассматривают мнемонику LSL и ASL как синонимы (например, ARM).

Что касается отсутствия арифметического сдвига вправо, вы всегда можете выполнить CMP # 80 / ROR A для выполнения арифметического сдвига вправо на аккумуляторе.

0 голосов
/ 25 января 2019

Почему нет инструкции арифметического сдвига вправо, почему так мало регистров, почему нет инструкции умножения / деления, почему нет SIMD, почему нет поддержки с плавающей запятой, почему нет MMU, .. .?

Когда проектировался 6502, существовали (относительно жесткие по современным меркам) ограничения как на количество транзисторов, так и на сложность ЦП. Были сделаны жертвы, чтобы сделать его жизнеспособным для разработки и производства, а целые числа со знаком «едва нужны».

Примечание. Основная причина использования «подписанного» заключается в том, что в С (и более поздних языках) заданы неправильные значения по умолчанию (предполагается, что «подписано» почти для всех целых чисел, если вы не укажете иное), а людям лень введите «unsigned», когда им не нужно подписывать; так что многие программы используют (немного дороже) арифметику со знаком только по ленивой причине. В целом, в большинстве ситуаций, когда вам действительно нужны знаковые числа, вы имеете дело с «значениями реального мира» и в любом случае нуждаетесь в числах с плавающей запятой (такие как индексы массивов, адреса / указатели, размеры, символьные / кодовые точки, значения пикселей, расстояния , ... все естественно без знака).

...