标签:A64 寄存器 add ADD w2 w1 w0 ArmV8
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(低十六位无符号扩展)等。
标签:A64,寄存器,add,ADD,w2,w1,w0,ArmV8 来源: https://blog.csdn.net/madaxin/article/details/123033597
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。