Как выполнить сдвиг вправо на RISC
Я хотел бы знать, как я могу выполнить правильный сдвиг на компьютере с уменьшенным набором инструкций, который не предлагает эту операцию самостоятельно.
Сдвиг влево можно просто сделать, добавив регистр к себе, но как насчет сдвига вправо?
RISC
предлагает только:
ADD
NOT
NXOR (XOR)
AND (NAND)
так OR
а также NOR
все могут быть эмулированы несколькими (N)AND
а также NOT
операции.
1 ответ
Решение
Программа C ниже использует только авторизованные инструкции плюс условные переходы, и она сдвигается input
в output
на 1
Если инструкция, которую вы пытаетесь эмулировать, это "сдвиг на n", то вам следует начать с c
равен 2н.
unsigned int shift_right(unsigned int input) {
unsigned int d = 1;
unsigned int output = 0;
for (unsigned int c = 2; c <= 0x80000000; c += c)
{
if (c & input)
output |= d;
d += d;
}
return output;
}