3

我正在阅读指令集手册,并且想知道.W后缀。

手册说:

在某些情况下,可能需要指定 .W 后缀,例如,如果操作数是指令的标签或文字数据,例如分支指令。这是因为汇编器可能不会自动生成正确大小的编码。

我想不出有什么理由需要覆盖汇编程序的默认编码。到目前为止,我尝试过的东西在没有.W.

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

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

4

1 回答 1

7

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

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

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

于 2015-10-25T16:11:47.697 回答