Как 32-разрядная ИК-команда удерживает нагрузку?(32-разрядная архитектура RISC)

Я немного запутался с размером инструкций и адресным пространством (я предполагал, что размер инструкций должен быть таким же, как размер битов адресов. Я не нашел достаточного объяснения в своей книге) Если я прав, то в теории, если у нас есть 2^32 адресуемые единицы (байты) памяти в 32-битной архитектуре (стиль RISC), как инструкция загрузки размером 4 байта содержит код операции и адрес?

4 ответа

Вы предполагаете, что одна инструкция может кодировать загрузку с произвольного абсолютного адреса. Это верно для x86, даже в 64-битном режиме (но есть специальный код операции для загрузки с 64-битного абсолютного адреса без регистра смещения или индекса, и dest должен быть rax).

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

Например,

int a;
int foo(void) { return a; }

компилируется в (ARM gcc 4.8.2 на godbolt):

foo():
    movw    r3, #:lower16:.LANCHOR0 @ tmp113,
    movt    r3, #:upper16:.LANCHOR0 @ tmp113,
    ldr r0, [r3]    @, a
    bx  lr  @
a:
    .space  4

Для инструкций доступа к памяти инструкции обычно используют адресный регистр со смещением. Что-то в форме: load R1, [R2 + 8], ARM, x86, MIPS и многие другие предлагают этот режим. Часто есть возможность использовать ПК в качестве регистра адресов, чтобы иметь возможность извлекать константы, которые находятся рядом с кодом.

Для инструкций перехода, в дополнение к использованию регистра адреса, у вас часто есть смещение, которое не использует регистр, но выполняет переход по командам X вперед или назад. Смещение обычно ограничено по диапазону и может быть смещено на некоторое количество (ограничено адресами, кратными 2, 4 ...), поэтому оно может помещаться в небольшой непосредственный операнд.
MIPS также использует смесь между абсолютным и относительным скачком: j инструкция переходит на абсолютный адрес, но в области текущей инструкции. Чтобы быть точным, в непосредственном адресе отсутствуют несколько верхних битов (чтобы он мог соответствовать), и вместо этого используйте верхние биты текущего ПК.

И еще одна хитрость (ARM также использует эту версию): если адрес инструкции должен быть выровнен по 4 байта, не включайте 2 младших бита - они должны быть равны нулю. Теперь у вас есть 2 бита для кода операции.

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

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

ARM делает это путем кодирования непосредственного с 8 битами, плюс дополнительное 4-битное поле, которое определяет вращение. CPU вычисляет непосредственное значение, беря эти 8 бит и сдвигая их количество раз, указанное в 4-битном поле.

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