ADD 立即数
示例:
add w0, w1, #255
等价于C语言的:
uint32_t w0, w1;
w0 = w1 + 255;
由于立即数ADD
指令码中立即数的编码位数为12位,所以立即数的数据范围为0<=imm<=4095
。
注:但是在测试该汇编语句时,我发现输入
4096
依然能正确运行,这应该是该指令码被另行转码的结果,但是根据文档描述不应该输入4096
及以上的立即数。
ADD 寄存器
示例:
add w0, w1, w2
等价于C语言的:
uint32_t w0, w1, w2;
w0 = w1 + w2
ADD 寄存器 + 位移操作
示例:
add w0, w1, w2, lsl #1
等价于C语言的:
uint32_t w0, w1, w2;
w0 = w1 + (w2 << 1)
移位操作的立即数必须大于等于0并且小于移位寄存器的位数,由于w寄存器是32位,所以也就是说,立即数应该小于32。(如果是x寄存器,则应该小于64)。
注:除了
lsl
外,还有lsr
(逻辑右移),以及asr
(算数右移)。
ADD 寄存器 + 位扩展操作
示例:
add w0, w1, w2, sxtb
等价于C语言的:
uint32_t w0, w1, w2;
w0 = w1 + (uint32_t)((int32_t)((int8_t)(w2&0xff)));
sxtb
的含义是将一个寄存器的值取低八位进行 带符号扩展 为寄存器的位数,举例假设w1
值为3000,w2
的值为255,由于255的低八位为0xff,对它进行带符号扩展为32位就是0xffffffff
,也就是-1,那么add w0, w1, w2, sxtb
的结果为3000+(-1)=2999
。其中最后一个字母b表示八位byte。头一个字母s表示带符号扩展。
其它位扩展操作还有:uxtb(低八位无符号扩展)、sxth(低十六位带符号扩展)、uxth(低十六位无符号扩展)等。