【问题标题】:Disable ARM 16-bit thumb instruction禁用 ARM 16 位拇指指令
【发布时间】:2014-12-22 18:45:42
【问题描述】:

在 ARM 世界中是否有办法只使用 32 位指令(例如在 Cortex M3 上)并禁用 16 位拇指指令?我说的是指令本身,而不是加载/存储访问机制。

对不起,如果这个问题已经被问过了,或者这个问题太愚蠢了,等等。

非常感谢您的帮助...

【问题讨论】:

  • 大部分 Cortex-M 芯片只使用 Thumb2 模式。真的只有thumb和ARM模式。 Thumb2 是 thumb 模式的扩展,具有 32 位和 16 位指令和伪条件执行。所有这些重载的概念都会使这个问题(和答案)变得混乱。
  • 直到 Cortex-m3,只有拇指模式。 M4 和 M7 支持 Thumb2。任何 Cortex-M 系列都没有 ARM 模式。

标签: arm thumb


【解决方案1】:

如果您只想强制选择 32 位编码而不是 16 位编码它们存在的地方,可以在汇编中通过将 .W 后缀添加到单个助记符来实现。然后,汇编器将发出 32 位编码,如果不可用,则引发错误。因此,您不能简单地将其应用于每条指令,因为某些 only 具有 16 位编码,但是敲出某种基于正则表达式的怪诞转换似乎是可行的。如果您正在处理已编译的高级代码,那么转换中间汇编列表或破解汇编器/编译器可能是唯一可行的选择。

【讨论】:

    【解决方案2】:

    大多数较新的芯片仅使用 Thumb-2 指令集,这意味着您将拥有一些 16 位指令和一些 32 位指令。如果要使用老式的仅 32 位 ARM 指令集,则需要查找较旧的硬件。

    【讨论】:

    • 这没有回答我的问题,主要是因为我的问题不够精确。无论出于何种原因(例如研究),我想禁用 16 位指令并且只在 Cortex M3 上运行 32 位指令(例如在我的 HDL 模型上运行在 FPGA 上)。任何胶水如何使用现代编译器禁用 16 位拇指,但继续使用 32 位拇指 2 指令(在现代芯片上)?
    • 哦,我明白你在问什么。不,我认为没有任何编译器提供这样做的选项。假设 32 位指令足够完整来表达你的整个程序,你可以修改 clang 以很容易地只发出那些指令,我想。
    【解决方案3】:

    cortex-m3 只是一个拇指机所以它只有一个 16 但拇指核心,32 位指令只是未定义的 16 位扩展,所以你必须使用 16 位拇指核心才能获得 32 位thumb2 扩展...所以根据定义,这是不可能的。

    32 位扩展也不足以满足您的所有需求。

    【讨论】:

    • 除了 CB(N)Z 指令外,我总能找到 32 位指令的“替代品”——快速通过 ISA——,但我并不总是找到 16 位的替代品。所以我认为编译器总是很可能有一个 32 位的解决方案,我想知道是否可以放弃对 16 位指令的优化。这让我想到了这个:除了之前建议的使用 clang 之外,你能禁用个别指令吗?我很想看到“-disable-thumb16”或“-disable-arc-reg-t1”,但我想我必须使用 16 位指令——我只是想确定一下。谢谢你们。
    • 您需要指定是希望硬件禁用这些指令还是让编译器不使用它们。后者在理论上是可能的,但任何编译器都支持吗?不确定,这是一个值得他们追求的功能吗?您当然可以自己将其添加到 gcc 和/或 llvm...
    • 您确实了解 thumb2 指令集在 armv6m 和 armv7m 之间差异很大,因此这只适用于 cortex-m3 和 m4 而不是 m0,您必须手动检查较大的 cortex-A看看他们支持什么
    猜你喜欢
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多