用arm-linux-gcc编译的时候碰到了这个错误:
led_on.S:5: Error: invalid constant (111400) after fixup
网上搜了一下,有如下解释:
mov R1, #0xf0f0f021 最好改成LDR R1,=0xf0f0f021 用mov的话只要立即数大于0x100后有些数可以编译通过但是有些数就不能编译通过
led_on.S:5: Error: invalid constant (111400) after fixup
网上搜了一下,有如下解释:
mov R1, #0xf0f0f021 最好改成LDR R1,=0xf0f0f021 用mov的话只要立即数大于0x100后有些数可以编译通过但是有些数就不能编译通过
从上面的解释可以看出,立即数只能表示8位,超过了8位就有问题了。如果超过了8位,可以用ldr指令,也可以用C语言定义变量(需用上面的立即数初始化),然后传进嵌入的汇编程序。
8位位图:
定义:
一个常数可由一个8位的常数循环右移偶数位得到, 我们称这个常数符合8位位图。
例子:
常数0x5A000000可由0x5A循环右移8位得到,符合。
常数0x00000101不可由一个8位的常数循环右移偶数位得到,因此不符合8位位图。
判断一个数是否符合8位位图的原则:
1、这个数的二进制表示中1的个数n不超过8个。
2、这n个1(n<=8)能同时放到8个二进制位中。
3、8个二进制位循环右移偶数位得到我们这个数。