我正在阅读指令集手册,我想知道.W
后缀。
手册说:
在某些情况下,可能需要指定.W后缀 例如,如果操作数是指令或文字数据的标签, 与分支指令的情况一样。这是因为汇编程序 可能无法自动生成正确的大小编码。
我无法想出为什么我需要来覆盖汇编程序的默认编码。到目前为止我所尝试的内容总是在没有.W
的情况下编译好。
他们是否真的添加了一种特殊的语法来克服汇编程序中可能存在的错误(可能同时修复)?
你能提供一些我必须明确使用.W(Cortex-M3上的Thumb2)的例子。
答案 0 :(得分:6)
语法中的.W
后缀仍然是必需的,即使大多数人永远不会明确使用它,以便维护反汇编任何有效代码并传递结果源的行为通过汇编程序返回会再次生成完全相同的指令。因此,每个有效的指令编码必须具有某种在语言中明确表示的方式,即使它不是汇编器默认为基本助记符和操作数选择的首选方法。当然,因为它存在于语法中,所以您不必直接编写机器代码或修补二进制文件来获取这些编码。
现在,在最终的二进制文件中需要非首选编码有各种深奥的原因 - 比如调整指令对齐,使用代码作为数据等等 - 但最不疯狂的编码可能是重定位。如果您有外部符号的分支或不同部分的符号,汇编程序不一定知道该符号最终会有多远。因此,它必须在发出可能最终无法链接的窄指令或者如果目标最终足够接近可能最终浪费代码空间的宽指令之间进行选择。 GNU as和armasm似乎都适用于后者,尽管由于尺寸原因,一些专门的嵌入式汇编程序默认为前者并不难。
运行时重定位是一个更强大的参数:你有一个分支或文字加载, 在汇编时被解析,但是你可能想在某些情况下进行热补丁来定位其他东西。即使原始目标位于狭窄范围内,也可能需要额外的宽编码范围。