在没有 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)
我需要将寄存器 (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)