首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >链接地址后的常量是否无效?

链接地址后的常量是否无效?
EN

Stack Overflow用户
提问于 2012-04-22 01:24:55
回答 1查看 27K关注 0票数 25

由于某些原因,当我试图编译这段代码时,编译器显示为syscall.s:72:invalid constant (0x172) after fixup

代码语言:javascript
复制
.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, #300add r7, #70临时修复了它,达到了预期的效果。但是仍然不确定是什么导致了这个错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-22 02:25:04

ARM指令集最高可达ARMv5,只能使用有限范围的立即值。问题是必须在指令本身中对值进行编码。由于所有ARM指令都是32位宽的,最初设置为ARMv5的指令总共只有8+4位来编码立即数。其中第一个8位能够加载0-255范围内的任何8位值,并且4位是在0和30之间以2为步长的右旋转。

因此,您可以加载如下值:

代码语言:javascript
复制
#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位值加载到上半部分,而不接触下半部分。

票数 47
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10261300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档