Умножение константы на значение регистра в ARM без инструкции MUL - PullRequest
0 голосов
/ 29 октября 2019

Мне нужно умножить значение регистра (r1) на 16385 и сохранить результат в том же регистре без использования инструкции MUL в одной строке кода.

Я знаю, что использование инструкции LSL приведет кумножьте значение на степень 2, но так как я пытаюсь умножить на нечетное число, я не понимаю, как это будет работать. Я видел другой похожий вопрос, где кто-то спрашивал, как умножить * 17, и был предоставлен ответ ADD r1, r1, r1 LSL # 4. Я не понимаю, почему это приведет к умножению значения на 17, и как я узнаю, что я умножаю на правильное значение.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

add r1, r1, r1, lsl #14

Это эквивалентно r1 = r1 + (r1<<14);

Кроме того, add r1, r1, r1, lsl #4 эквивалентно r1 = r1 + (r1<<4);, что опять же, эквивалентно r1 = 16*r1 + r1;

0 голосов
/ 30 октября 2019

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

Умножение в двоичном формате в 10 раз проще, чем десятичное.

Если у меня есть двоичное число abcd, где a, b, c, d - каждый отдельный бит, либо один, либо ноль каждый. И я хочу умножить это на 5 десятичных, что является двоичным 0b101.

   abcd
*  0101
=========

и заполнить его, длинное умножение, если вы будете

     abcd
*    0101
=========
     abcd
    0000
   abcd
+ 0000
=========

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

Вы также можете использовать другую начальную школу по математике

x * 5 = x * (2 ^ 2 + 2 ^ 0) = (x * 2 ^ 2) + (x * 2 ^ 0) = (x * 4) + x = (x << 2) + x </p>

В вашем случае:

16385d = 0x4001 = 0x0100000000000001 = (1 << 14) + (1 << 0) </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...