Подтвердить что ты не робот

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

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

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

Не могли бы вы предложить набор наиболее простых и важных инструкций по сборке? Спасибо!

4b9b3361

Ответ 1

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

Ответ 2

Структуры управления составляют основную функцию, без которой нет языка. Это означает, что ваш язык должен обеспечивать арифметические операции над двумя переменными; а затем разрешить программе изменять счетчик программ, т.е. на ветку - на основе результата операции. Очень часто ключевой операцией является SUB, для вычитания одного операнда из другого. И условия, на которые вы могли бы разрешить ветку, следующие:

  • результат равен нулю;
  • результат больше нуля;
  • результат меньше нуля.
  • нет условия, т.е. безусловная ветвь

Вам также понадобятся инструкции по перемещению данных: LOAD и STORE, скажем.

Эти три условия и их соответствующие ветки (или пропуски, что является другим способом сделать это) необходимы для любой программы. Не только это, но и только эти три простых операции плюс инструкции по перемещению данных, достаточны для в программе, кроме ввода-вывода. Если бы вы захотели и предоставили сотрудничающую организацию памяти, вы могли бы переписать Linux, используя только LOAD, STORE, ADD, SUB и три условные ветки.

PDP-8 был гораздо более мощной машиной, чем этот: у него был богатый набор из восьми инструкций, включая ввод-вывод.

HTH

Ответ 4

Наименьший набор инструкций требует без инструкций или, возможно, нулевых инструкций. Я не знаю, использовались ли они в реальных устройствах или нет, но компьютер с одним набором инструкций (OISC) былреализован и успешно работает на компьютерах с углеродными наноpipeками и MAXQ.

Фактически, x86 также может использоваться как архитектура OISC, потому что можно делать все, что угодно только с одним mov, потому что он доказал свою полноту по Тьюрингу. Есть даже компилятор с именем movfuscator, чтобы скомпилировать действительный код C в программу только с MOV (или только с XOR, SUB, ADD, XADD, ADC, SBB, AND/OR, PUSH/POP, 1- сдвиги битов или CMPXCHG/XCHG)


Однако IMO архитектура должна быть достаточно "быстрой" (или не требовать слишком большого количества инструкций, таких как OISC, для задачи по сравнению с другими архитектурами) , чтобы ее считали полезной.

Основными типами команд для компьютера являются движения данных, логические/арифметические операции и ветвление. Для арифметических операций достаточно просто add/subtract. Для логики мы можем вычислить любые функции только с NOR или NAND, поэтому нужна только одна. Для прыжка нам понадобится одна инструкция jump on "<=" или jump on "<". Движения данных можно эмулировать с помощью add/sub. Таким образом, мы можем использовать 2 бита для кодирования 3 кодов операций (add, nand, jump on "<=") и оставить один для дальнейшего расширения. Но поскольку в нем нет отдельных инструкций загрузки/сохранения, он должен работать непосредственно с большим регистровым файлом, а не с памятью, или инструкции должны иметь возможность использовать память в качестве операндов.

Если требуется большая скорость, то можно добавить еще немного логики, инструкции ветвления и, возможно, загрузить/сохранить, увеличив пространство кода операции до 3 бит. Набор команд может быть:

  1. загрузить
  2. магазин
  3. добавить
  4. и
  5. ни
  6. прыгать меньше, чем
  7. прыгать на равных

Сдвиг влево можно сделать с помощью add, но сдвиг вправо сложнее, поэтому вы также можете добавить сдвиг вправо, чтобы упростить некоторые общие операции

Ответ 5

Вы можете отлично справиться с минимальным набором команд, состоящим только из SOB: вычесть одно и разветкить. Целые программы могут и были написаны с этим.

Ответ 6

Посмотрите на коммерческие реализации

Лучший ответ, вероятно, будет смотреть на существующие коммерческие реализации.

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

Каково определение инструкции?

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

Будет ли это коммерчески привлекательным, однако? Маловероятно, поскольку это оборудование, вероятно, будет слишком специализированным, чтобы оправдать затраты на разработку.

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

В конце концов, "эффективное оборудование" означает:

  • взять набор тестов, назначить один вес важности для каждого
  • написать оптимальное программное обеспечение, которое решает эти тесты

Возможные причины, по которым очень маленькие полные по Тьюрингу ISA могут быть неэффективными

  • те немногие инструкции, которые у них есть, очень сложны и каждый раз, когда их вызывают, несут большие расходы, например, Вы не можете выполнять определенную оптимизацию конвейерной обработки
  • плотность кода очень мала, что подразумевает:
    • производительность может быть ограничена извлечением команд
    • не подходит для встраиваемых устройств с небольшим объемом ПЗУ

Известные реализации OISC

Было бы интересно проанализировать их, чтобы получить более конкретный ответ.

movfuscator

https://github.com/xoreaxeaxeax/movfuscator

Компилятор Toy C для x86, который использует только инструкции mov x86, показывая очень конкретным образом, что достаточно одной инструкции.

Полнота Тьюринга, кажется, была доказана в статье: https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf

subleq

Образовательная OSIC, ранее упомянутая в fooobar.com/questions/272359/..., но без названия:

Смотрите также: https://esolangs.org/wiki/Subleq

Смотрите также

https://softwareengineering.stackexchange.com/questions/230538/what-is-the-absolute-minimum-set-of-instructions-required-to-build-a-turing-comp/325501

Ответ 7

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

MOV mem1 mem2 - скопировать содержимое ячейки памяти mem1 в ячейку памяти mem2, оставив mem1 без изменений

NAND mem1 mem2 - mem3- выполняет побитовое логическое NAND между данными в mem1 и mem2 и записывает результат в mem3

BITSHIFTR mem1 mem2 mem3- битное смещение вправо для данных в местах mem1 mem2 и запись вывода в mem3

JMPcond mem1 mem2 - проверить младший значащий бит в mem1 и, если оно истинно (1), перейти к mem2

Теперь он не будет очень быстрым и потребляет пропускную способность памяти, как сумасшедший, но его можно использовать для реализации виртуальной машины с любым произвольным набором инструкций. Кроме того, существуют определенные программные ограничения, такие как необходимость программирования во всех начальных данных или, по крайней мере, место в памяти, где только LSB установлен в 1. аппаратные периферийные устройства должны будут использовать DMA для доступа к вводу/выводу, и, если реализовано на Гарвардская архитектура У программы не будет прямого доступа к таким вещам, как указатели.