【问题标题】:ARM assembly - how to compare with large numberARM汇编 - 如何与大量比较
【发布时间】:2020-10-16 15:41:16
【问题描述】:

我是 ARM 汇编的新手。我正在尝试与数字 1200 进行比较并注册 r1。 所以我尝试了:

 mov r2, #1210
 cmp r2, r1

但它不起作用。我在 Raspberry pi 3 中进行此编程。我试过了:

 cmp #1210, r1

但它也不起作用。我该如何解决这个问题?并且,如果 r6 的地址是 0x00010000 并且汇编代码是:

ldr r10, r6, #8

和下面的代码一样吗?如果没有,如何在不使用 r6 的情况下更改代码?谢谢。

ldr r10, #0x00010008

【问题讨论】:

  • 您能详细说明“它不起作用”是什么意思吗?不会组装?产生与您预期不同的结果?那是什么不同的结果?
  • 我认为使用 mov,数量限制是 255。如果我尝试使用低于 255 的数字,它可以工作,但 1210 不能工作。 (编译错误)有什么方法可以使用1210吗?
  • mov 指令的立即数宽度为 8 位 (0-255)。然而,有时还有更多的故事(见stackoverflow.com/questions/2624471/…)。
  • 在进行汇编语言编程或至少学习新指令集时,您应该始终将文档放在身边。这不是 mov 指令的合法立即数,因此您必须使用另一条指令或使用某些汇编程序支持的伪指令 ldr r2,=1210。 gnu 汇编器将使用最佳解决方案(如下面的答案中所指出的)。通过使用带有 gnu 汇编器的伪指令(对于任何立即数),您可以获得“最佳”解决方案。但是汇编是基于汇编器的,而不是目标的,因此并非所有工具都如此
  • 将立即数加载到寄存器中已在此站点以及其他地方多次询问和回答。以及为什么这不起作用。

标签: c assembly arm


【解决方案1】:

movw 可以解决问题。它允许任何16位数字(0~65535)

【讨论】:

  • 仅在 ARMv6T2 及更高版本中可用(请参阅here)。
  • @TonyK:由于 Raspberry Pi 3 使用的是 Cortex-A53,并且由于 ARMv8-A 包含 AArch32,它提供与 ARMv7-A 的向后兼容性,所以 movw 的可用性应该不是问题.
猜你喜欢
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多