【问题标题】:Assembling MULS instruction on ARM with gcc and as使用 gcc 和 as 在 ARM 上组装 MULS 指令
【发布时间】:2020-02-07 09:57:43
【问题描述】:

我在汇编文件中有以下指令:

MULS R0, R0, R2        

使用 gcc (gcc -o prog pros.s) 可以很好地组装,并且程序可以正常工作。 当我使用 as 来组装(as -o prog.o pros.s)时,我得到:

Rd and Rm should be different in mul

知道为什么吗?

【问题讨论】:

  • 我相信这条规则存在于早期内核上的核心实现(阅读错误或功能),但如果您使用后一个内核,我认为这并不重要,请阅读架构参考手册。你在命令行上调用的是什么核心?它默认为 armv4t 吗?
  • 指定相同的寄存器以前被描述为产生不可预测的结果。 ARMv6 没有限制,并且相信所有相关的 ARMv4 和 ARMv5 实现也不需要这个限制,因为高性能乘法器在写回任何结果之前读取所有操作数。
  • 那是手臂上的
  • 这意味着 armv4 和 armv5 有问题,armv6 和 armv7 没有
  • @old_timer,很好的问题,因为我没有为 gcc 调用指定核心。这是在运行 32 位 debian 的 Rpi 上构建的代码,因此 AFAIK 应该是 armv8。参考手册似乎没有指定寄存器必须不同的任何一种方式。我使用 GDB 运行 gcc 程序,反汇编代码,得出 MULS 助记符。

标签: gcc assembly raspberry-pi arm


【解决方案1】:

来自 ARM ARM

为 和 指定相同的寄存器以前被描述为产生不可预测的结果。 ARMv6 没有限制,相信所有相关的 ARMv4 和 ARMv5 实现也不需要这个限制,因为高性能乘法器会在写回任何结果之前读取其所有操作数

ARMv4 和 ARMv5 有这个规则/问题,认为是错误,而不是功能。 ARMv6 和 ARMv7 没有这个问题,所以请检查您在编译时使用的 cpu/arch 设置,更重要的是您使用的是什么目标。

【讨论】:

  • armv7 有一些与其中一个寄存器相关的其他有趣的语言,我不明白,可以回去阅读。 ARM ARM 表示 ARM 架构参考手册,出于某种原因,这对他们来说是不寻常的,ARMv7-AR 没有提到这个 ARMv4/5 的东西,但总是很好地检查一下,所以他们所谓的 armv5 参考手册有上述内容,armv7还有其他东西,armv8 是 aarch64,aarch32 是 armv7 兼容模式,因此 armv5 和 armv7 ARM 是您查找这些东西的地方 infocenter.arm.com 可能不得不放弃电子邮件地址
【解决方案2】:

可能 gcc 对 thumb 与 ARM 模式使用不同的默认值,或默认的 CPU 架构版本。使用gcc -v 查看它传递给as 的内容。

http://www.keil.com/support/man/docs/armasm/armasm_dom1361289882394.htm 表示在 ARMv6 之前,ARM 的 Rd 和 Rn 必须不同。

但拇指模式下的muls 在 ARMv6T2 中仅可作为 32 位 Thumb2 指令使用,因此它始终支持使用相同的寄存器作为目标和第一个源。所以在 Thumb 模式下组装意味着这种形式总是被允许的。

如果你想在 ARM 模式下组装,你可以使用 as -march=armv7 或其他东西告诉它目标 CPU 是 ARMv7(因此不需要避免使用相同的寄存器。)

如果您也可以在源代码中使用汇编器指令设置其中的一些内容,那么 IDK。

【讨论】:

  • 原来 gcc 默认使用 ARMv6,而 ARMv4 也是如此。通过设置为 -march=armv8-a 它组装得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多