在ARM汇编指令中,并不是所有的立即数都是合法的,有时候如果使用不当,将会引起报错。比如ORR R0,R0,0xffff或者BIC R0,R0,0xffff之类。
那这到底是什么原因呢?
ARM规定:
如果一个立即数是小于256的(即该立即数是8bits以内的,0~255),该立即数是合法的。
如果一个立即数是大于等于256,该立即数经过循环左移偶数位,可以得到一个小于256的数,则该立即数合法。
256 = 0x100 ------→左移20位0x10000000----→左移4 0x1 合法
0x111 非法
0x102 非法
0x104 合法
ARM在数据处理指令编码的时候,立即数用12bits来表示:
高4bits:循环左移左移偶数位除以2
低8bits:循环左移后的结果。
重要问题:
ADD R1,R0,#0xffff 非法
解决:
先将立即数放到寄存器然后再操作
LDR R2,=0xffff // R2=0xffff,将立即数0xffff的值传送给R2
ADD R1, R0, R2