[gas][cortex-m23] 为什么这个 beq.w 会导致硬故障?

问题描述

编写一些代码来测试 CM-23 ARM 汇编指令集,我遇到了这种奇怪的(对我来说)关于以下条件跳转的行为。

00001240: 0x01f0ef80 beq.w 0x2422 <cmp_r0__r1_Failed>

包含函数具有以下指令:

  • .arch armv8-m.base
  • .语法统一
  • .代码 16
  • .thumb_func

Generic User Guide rev. r1p0 中可以看出 B{cond} 的使用限制如下[−256 字节到 +254 字节]。 这种情况下的有效跳转大约是 0x200,但 .w 后缀应该至少将这个范围扩展到 16 位领域。

在构建过程中,汇编器没有给出错误/警告,整个过程就完成了。然后发生了硬故障(将此类指令指向罪魁祸首)。

如果我写了一个非法指令,至少我希望汇编器能抱怨。

在这里错过了什么?感谢您提供有关它的任何线索。

解决方法

您可以在 cortex-m23 技术参考手册中看到

该处理器是 ARMv8-M 基线架构的实现。

然后在 armv8-m 架构参考手册中。

Armv7-M 兼容性需要主扩展。

而且你可以在armv7-m文档中看到宽条件分支只有armv7-m。以及在 armv6-m 架构参考手册中没有看到它们。

请注意,arm 文档的两种主要类型是每个内核的技术参考手册和每个架构的架构参考手册。而且那些文档还不错,其他的ARM文档和网页就没有那么好,如果没有错的话会误导。

如果您说这些工具正在生成代码,则不应向 binutils 人员提交工单。