Assembly Arm错误A1174E:数据传输偏移量0x00002000超出范围。允许的值为0xFFFFF001到0x00000FFF

Assembly Arm错误A1174E:数据传输偏移量0x00002000超出范围。允许的值为0xFFFFF001到0x00000FFF,assembly,arm,keil,Assembly,Arm,Keil,我有一个简单的程序集,它生成了以下错误 装配 LDR r14,[r12,#0x00002000] 错误 testspeed.s(23): error: A1174E: Data transfer offset 0x00002000 out of range. Permitted values are 0xFFFFFF01 to 0x00000FFF 抬头看一下,我明白了错误的原因 A1174E: Data transfer offset 0x<val> out of rang

我有一个简单的程序集,它生成了以下错误

装配

LDR r14,[r12,#0x00002000]
错误

testspeed.s(23): error: A1174E: Data transfer offset 0x00002000 out of range.  Permitted values are 0xFFFFFF01 to 0x00000FFF
抬头看一下,我明白了错误的原因

 A1174E: Data transfer offset 0x<val> out of range. Permitted values are 0x<mini> to 0x<maxi>

有人知道这是什么0x和0x吗?它在哪里?我能控制它吗

这是ARM指令集的一个限制。Per:

由于某些原因,文档中缺少减号

您的偏移量太大,无法用作立即数。你必须想出一些其他的方法来访问内存,比如说,把它分成两条指令

ADD r14, r12, #0x00002000
LDR r14, [r14]

它们是错误消息中替换的实际值的占位符。在本例中,0x替换为0xFFFF01,0x替换为0x00000FFF。您可以更改这些值,它们是ARM体系结构的一个限制。您需要重写汇编语句。@RossRidge在我的程序中在哪里可以设置这些语句?有关于这些的文件吗。我似乎找不到任何有用的东西。对不起,我的意思是说你不能更改它们。错误消息告诉了你需要知道的一切。只要在指令集中查找该指令,就可以解释该限制的来源。堆栈溢出的目的不是为您查找这些内容。infocenter.arm.com有很多有用的东西,arm.com应该是您首先查看的地方。
ADD r14, r12, #0x00002000
LDR r14, [r14]