【问题标题】:some arm inline assembly [closed]一些手臂内联组件[关闭]
【发布时间】:2013-02-05 03:07:54
【问题描述】:

我有手臂组装问题。 以下 armv7 汇编代码的十六进制二进制输出是什么?

LDR r3, #0xaabbccdd
BLX r3

我需要这个代码片段的汇编输出 但是我的电脑环境很差

提前谢谢你

【问题讨论】:

  • 这不会编译。您不能在一条指令中使用LDR r3, #0xaabbccdd,因为一条 arm 指令可以是 16 位或 32 位,它不允许您同时加载 32 位值。
  • 请以“我有这个问题并想知道如何最好地解决它”的形式陈述问题。或“为什么这种方法不起作用?”。您当前的问题介于两者之间,几乎没有信心相信我给出的任何答案实际上对您有任何实际用途。
  • @unixsmurf 我以为他只是想获得这两条指令的二进制编码,我投了赞成票。
  • 对不起,这实际上是一个糟糕的问题。我需要尽快知道这些汇编代码的二进制编码,但我只能使用互联网。

标签: gcc arm


【解决方案1】:

正如评论者所提到的,LDR r3,#0xaabbccdd 不是有效指令。 ARM 操作码中的立即数采用ZeroExtend(imm8) ROR (imm4*2) 的形式,这将允许您表示例如0xaa0000000x00bb0000 甚至 0xd000000d - 但不是例如0xaabb00000xaabbccdd.

汇编器通常提供用于加载 32 位立即数的伪指令,例如在 GAS 中你可以这样做:

ldr r3,=0xaabbccdd

这将被编码为与 PC 相关的负载 - 即 ldr r3,[pc,#offset]。偏移量(以及精确的指令编码)取决于指令到存储值的literal pool 的距离。

【讨论】:

  • 感谢您的帮助。我知道单个 ARM 指令无法将 32 位 imm 值加载到寄存器中。我想知道汇编程序将如何处理这个伪指令。
猜你喜欢
  • 2014-09-07
  • 2021-10-10
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多