我在这里看到http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/CIHDGFEG.html手臂上的 thumb2 ldr 必须是 4 的倍数。
我在手臂拇指 2 上运行并想运行此指令ldr r0, [pc, #0x13]。
我 truslate inDFF81300并且有效,即使 0x13 也不是 4 的倍数。
这是为什么?
我在这里看到http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/CIHDGFEG.html手臂上的 thumb2 ldr 必须是 4 的倍数。
我在手臂拇指 2 上运行并想运行此指令ldr r0, [pc, #0x13]。
我 truslate inDFF81300并且有效,即使 0x13 也不是 4 的倍数。
这是为什么?
您的汇编程序为 ldr 生成的指令实际上是 ldr.w,一条 32 位 Thumb 2 指令,正如您在使用四个字节的编码中看到的那样。根据我的经验,ARM 汇编程序试图变得聪明并找出最佳(或唯一)工作指令编码 - 特别是在使用统一语法时。
四字节对齐只是对编码为 16 位指令的 ldr 指令的限制(您链接的文档中的脚注 [b])。我想这个限制是由于 16 位操作码中常量偏移的编码空间受限造成的,所以拇指指令集设计者在这里选择了更大的可能偏移。