assembly - .W 后缀在 ARM 汇编程序中的用法

标签 assembly arm thumb

<分区>

我正在阅读指令集手册,并对 .W 后缀感到疑惑。

手册说:

In some cases it might be necessary to specify the .W suffix, for example if the operand is the label of an instruction or literal data, as in the case of branch instructions. This is because the assembler might not automatically generate the right size encoding.

我想不出有什么理由需要覆盖汇编程序的默认编码。到目前为止,我所尝试的总是在没有 .W 的情况下编译得很好。

他们是否真的添加了一种特殊的语法来克服汇编程序中可能存在的错误(也许同时已修复)?

您能否提供一些我必须明确使用 .W(Cortex-M3 上的 Thumb2)的示例。

最佳答案

.W 后缀在语法中仍然是必需的,即使大多数人永远不会明确地使用它,以保持反汇编任何有效代码的行为和通过汇编器将生成的源代码传回会再次产生完全相同的指令。因此,每个有效的指令编码都必须有某种方式在语言中明确表示,即使它不是汇编程序默认为基本助记符和操作数选择的首选方式。当然,因为它存在于语法中,所以您不必直接编写机器代码或修补二进制文件来首先获得这些编码。

现在,有各种深奥的原因要求在最终二进制文件中使用非首选编码 - 例如调整指令对齐、使用代码作为数据等 - 但最不疯狂的可能是重定位。如果您有一个外部符号的分支,或者一个不同部分中的符号,汇编器不一定知道该符号将结束多远。因此,它必须在发出一条可能最终无法链接的窄指令和一条如果目标距离足够近时可能最终浪费代码空间的宽指令之间做出选择。 GNU as 和 armasm 似乎都支持后者,尽管不难想象一些专门的嵌入式汇编程序会因为大小原因而默认使用前者。

运行时重定位是一个更有力的论据:您有一个分支或文字加载, 在汇编时解决,但您可能希望在某些情况下热补丁以针对其他内容。即使原始目标位于窄编码范围内,这也可能需要宽编码的额外范围。

关于assembly - .W 后缀在 ARM 汇编程序中的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33330418/

相关文章:

c++ - 在函数中更改数组值 - 内联汇编

gcc - 原生树莓派编译问题

c++ - ARM 设备的交叉编译库

arm - Thumb-2指令的W后缀是什么意思?

ios - 有没有办法在运行时检测 iOS 上的 VFP/NEON/Thumb/...?

更改内存中的 'call'地址?

Visual Studio 可以用来运行带有 ARM 脚本的 C 代码吗?

函数调用后栈的内容

c++ - 使用通用运算符->* 作为右值

c - 在 C 中组合 ASM block 时出现问题