ARM-V7-A ADD指令结合LSL
ARM-V7-A ADD instruction combined with LSL
add r1, r1, r0, lsl #3
我不确定这条指令执行的操作。
是否表示:
- 将r0和r1相加,取结果左移3位,然后将结果存入r1
或者
- 将r1和(r0左移3位)相加然后将结果保存在r1
提前致谢。
Thumb 和 Thumb-2 指令集中的大多数算术和逻辑指令都采用三个参数。第一个是目标寄存器,第二个是第一个操作数(也是一个寄存器),第三个是flexible第二个操作数。 (如果省略目标寄存器,则第一个操作数用作目标。)
在几乎所有情况下,灵活的第二个操作数可以是:
- 一个寄存器
- 应用了移位或轮换的寄存器,其中可用的移位是
ASR #n
(算术右移)
LSL #n
(逻辑左移)
LSR #n
(逻辑右移)
ROR #n
(向右旋转)
RRX
(通过进位循环右移一位)
- 格式为
#constant
的常量,其中 #constant
可以是:
- 可以通过将 8 位值左移 32 位字中的任意位数得到的任何常量
0x00XY00XY
形式的任何常量
0xXY00XY00
形式的任何常量
0xXYXYXYXY
形式的任何常量
所以在你的例子中,r0, lsl #3
是 add
指令的第二个操作数,因此移位在加法之前执行。
有关详细信息,请参阅 ARM developer documentation。
add r1, r1, r0, lsl #3
我不确定这条指令执行的操作。 是否表示:
- 将r0和r1相加,取结果左移3位,然后将结果存入r1 或者
- 将r1和(r0左移3位)相加然后将结果保存在r1
提前致谢。
Thumb 和 Thumb-2 指令集中的大多数算术和逻辑指令都采用三个参数。第一个是目标寄存器,第二个是第一个操作数(也是一个寄存器),第三个是flexible第二个操作数。 (如果省略目标寄存器,则第一个操作数用作目标。)
在几乎所有情况下,灵活的第二个操作数可以是:
- 一个寄存器
- 应用了移位或轮换的寄存器,其中可用的移位是
ASR #n
(算术右移)LSL #n
(逻辑左移)LSR #n
(逻辑右移)ROR #n
(向右旋转)RRX
(通过进位循环右移一位)
- 格式为
#constant
的常量,其中#constant
可以是:- 可以通过将 8 位值左移 32 位字中的任意位数得到的任何常量
0x00XY00XY
形式的任何常量
0xXY00XY00
形式的任何常量
0xXYXYXYXY
形式的任何常量
所以在你的例子中,r0, lsl #3
是 add
指令的第二个操作数,因此移位在加法之前执行。
有关详细信息,请参阅 ARM developer documentation。