问题:
做嵌入式开发时,写了如下语句:
mov r1,#0x36164
编译结果:
invalid constant -- `mov r1,#0x36164'
解决办法:
1.
@0x36164=((3<<16)|(6<<12)|(1<<8)|(6<<4)|(4))
mov r1, #((1<<8)|(6<<4)|(4))
orr r1, r1, #((3<<16)|(6<<12))
2.
ldr r1,=((3<<16)|(6<<12)|(1<<8)|(6<<4)|(4))
原因:
在ARM中,按照精简指令的构成,mov指令留给立即数的位数只有12位,其他位用作存放寄存器号和指令码。这12位又分为immed_8和 rotate_imm,其中immed_8占8位,rotate_imm占4位,这样立即数操作就只能使用8bit数字或者通过移位以后能把有效位控制在8bit以内。
如:这里的0x36164,为 0011 0110 0001 0110 0100B,
如果右移两位的话,为0011 0110 0001 0110 01B,有效位数,从第0位到19位,超过8位,这样根据规则是不可以的;
但如果把这个数分成两部分,即(0011 0110B<<12)和 (0001 0110 0100B),
则每部分通过移位之后,有效位都在八位以内,这样就符合要求了。
------------------------------------------------------------------------------------------------------------------------------------------------------