x86 не может делать много без регистров, поэтому я не думаю, что вы можете избавиться от режима адресации. Некоторые очень разные архитектуры могут не использовать регистры и просто иметь инструкции по памяти или стеку. IDK, как они реализуют указатели; возможно, такие архитектуры могут делать memory[memory]
(запись в массиве C).
Immediate не требуется для вычислений возможно. Вы можете построить любое значение, используя несколько регистров. Начните с нуля(), inc
, чтобы получить 1, с левой стороны сдвинуть его в любую нужную позицию, inc
, чтобы установить низкий бит, сдвиг влево и т. Д. Так что в худшем случае нужно получить 2*popcount(N)
инструкции для получения N
в регистр. Обратите внимание, что немедленный подсчет сдвигов будет недоступен, поэтому очевидный метод повторного переключения на один (shl eax
, да есть отдельная кодировка для переключения по одному или просто используйте add eax, eax
) будет просто зависеть от положения самый старший бит набора. Итак, log2(N) + popcount(N)
за очевидный сдвиг и инк.
Абсолютная (то, что вы называете прямой) адресация памяти не является наиболее полезным режимом адресации. Мы можем эмулировать его, создавая адреса с последовательностью инструкций (см. Выше) и используя [register]
. Если мы пытаемся срубить, мы захотим его остановить. Как отметил Джесмер, сохраняя абсолютную адресацию, поскольку наша единственная форма была бы ужасно неудобной (или, возможно, невозможной?) Для использования.
Индекс, очевидно, доступен для исполнения, а не для необходимости: вы можете сменить и добавить с помощью отдельных инструкций.
Перемещения также предназначены только для повышения производительности, поэтому мы можем избавиться от них и заставить код добавить любое перемещение вручную. См. Немедленный параграф.
Я считаю, что x86 будет по-прежнему может быть произвольно программируются с режимами простоregister
и [register]
адресации.
С register
, [register]
и immediate
производительность должна быть не намного хуже, чем полная x86.
Если неявный доступ к памяти не учитывается как режим адресации, вы можете, конечно, подражать [register]
с lodsd
и stosd
, но вы не смогли бы сделать атомарные операции чтение-модификация-запись. Это похоже на обман.
Существует также стек (push/pop
): Я не знаю, является ли машина стека + регистром завершена, но она, конечно же, не программируется в обычном смысле. Конечно, если вы измените e/rsp
, вы можете снова эмулировать [register]
, но с меньшим выбором размера операнда, чем lodsb/w/d/q
/stosb/w/d/q
.
x86 имеет достаточно места для хранения вещей в регистрах, если вы включаете регистры 16 ymm. Хотя я не могу придумать способ перемещения данных между целочисленными регистрами и высоким 128b ymm без использования памяти или непосредственных операндов (для vextractf128
), поэтому на практике у вас больше похоже шестнадцать 16-битных регистраторов для локализации локальных иначе, чем стек. Тем не менее, это ограниченный размер, что, вероятно, означает, что 8 регистров GP в 32-битной 386 ISA по сравнению со всеми регистрами integer/mmx/ymm в 64-битной AVA2 ISA не имеют отношения к тому, является ли машина завершенной, только push/pop , регистры и никакая модификация указателя стека, кроме push/pop.
Есть много вещей, которые можно заменить другими вещами. Зачем вам 'inc' или' sub', если у вас есть 'add'. Однако косвенный режим не просто заменяется, если вы не используете самомодифицирующийся код. Попробуйте реализовать указатели без него. – Jester