ArmV8 A64汇编指令ADD

511 阅读1分钟

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(低十六位无符号扩展)等。