在没有 MUL 指令的情况下将常量与 ARM 中的寄存器值相乘

Multiplying a constant with the value of a register in ARM without the MUL instruction

我需要将寄存器 (r1) 的值乘以 16385 并将结果存储在同一个寄存器中,而无需在一行代码中使用 MUL 指令。

我知道使用 LSL 指令会将一个值乘以 2 的幂,但由于我试图乘以一个奇数,所以我看不出它是如何工作的。我看到另一个类似的问题,有人在问如何乘以 a*17,提供的答案是 ADD r1, r1, r1 LSL #4。我不明白为什么这会导致值乘以 17,以及我怎么知道我乘以正确的值。

add r1, r1, r1, lsl #14

相当于r1 = r1 + (r1<<14);

此外,add r1, r1, r1, lsl #4 等同于 r1 = r1 + (r1<<4); 又等同于 r1 = 16*r1 + r1;

实际上你从小学数学就知道这是怎么回事。

二进制乘法比十进制简单10倍。

如果我有二进制数 abcd,其中 a、b、c、d 是每个单独的位,每个位为 1 或 0。我想将它乘以 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

你的情况:

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