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

Usage of the .W suffix in ARM assembler

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

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

运行时重定位是一个更有力的论点:你有一个分支或文字负载,在汇编时解决的,但你可能想在某些情况下热补丁以瞄准其他东西.即使原始目标位于窄编码范围内,这也可能需要宽编码的额外范围。