由于某些原因,当我试图编译这段代码时,编译器显示为syscall.s:72:invalid constant (0x172) after fixup
.globl _mach_msg_trap$MACH
_mach_msg_trap$MACH:
stmfd sp!, {r4,r7}
mov r7, #370 /* this is line 72 */
svc 0
ldmfd sp!, {r4, r7}
bx lr
我不知道它为什么要这么做。当我将一个较小的常量放入r7
中时,它工作得很好。但是对于更高的数字,它会产生这个错误。我已经通过mov r7, #300
和add r7, #70
临时修复了它,达到了预期的效果。但是仍然不确定是什么导致了这个错误。
发布于 2012-04-22 02:25:04
ARM指令集最高可达ARMv5,只能使用有限范围的立即值。问题是必须在指令本身中对值进行编码。由于所有ARM指令都是32位宽的,最初设置为ARMv5的指令总共只有8+4位来编码立即数。其中第一个8位能够加载0-255范围内的任何8位值,并且4位是在0和30之间以2为步长的右旋转。
因此,您可以加载如下值:
#0
#122
#121 ror #24 = 30976
#230 ror #12 = 241172480
但是,这个方案不能加载#370,它需要像#185 ror #31
这样的东西,这是不可能的。
加载立即值有两种方法。
通过使用ldr:ldr r7,=#370
从内存中加载值,汇编程序将创建一个常量池,并通过pc相对寻址从常量池中加载值。
通常,您应该更喜欢使用最多2条指令来构造常量,如果这是不可能的(或者值必须是可重定位的),则使用ldr。
从ARMv7开始,您还可以使用movw
将任何16位值加载到寄存器的下半部分,同时将上半部分置零,并使用movt
将另一个16位值加载到上半部分,而不接触下半部分。
https://stackoverflow.com/questions/10261300
复制相似问题