【发布时间】:2015-10-25 13:48:26
【问题描述】:
我正在阅读指令集手册,我想知道 .W 后缀。
手册说:
在某些情况下,可能需要指定 .W 后缀,因为 例如,如果操作数是指令或文字数据的标签, 与分支指令的情况一样。这是因为汇编器 可能不会自动生成正确的大小编码。
我想不出有什么理由需要覆盖汇编器的默认编码。到目前为止,我尝试过的东西在没有.W 的情况下总是编译得很好。
他们是否真的添加了一种特殊的语法来克服汇编器中可能存在的错误(也许同时修复了)?
您能否提供一些我必须明确使用 .W(Cortex-M3 上的 Thumb2)的示例。
【问题讨论】:
-
它可以帮助汇编器清楚地了解何时可以在 thumb 和 thumb2 之间进行选择。只需查看 ARM ARM 中的 B 编码/指令,您就可以看出区别。根据条件或无条件,所有变体都提供 8 位或 11 位立即数。 thumb2 扩展根据条件提供 16 位或 21 位立即数。通过使用 .w 您表明您想要 thumb2 而不是让汇编程序猜测。但是,如果汇编程序在这种情况下猜错了,我会称之为错误。
-
对于组装时的已知标签,它知道它必须编码什么。对于外部标签,它可以烧掉半字以减少链接器出现问题或必须添加东西的变化。但是如果需要,gcc 链接器至少现在添加了一个蹦床以到达所需的地址。在这种情况下(或在编写手册时),arm assembler/linker 可能不如 gnu 好
-
如果您特别希望 thumb2 扩展名用于出于某种原因,您使用 .w 强制执行此操作
-
thumb2 扩展可以在 m0、m0+、m1、m3、m4、m7 和 cortex-a 上找到,或者至少在其中一些上。什么数字不同。例如,armv6m(皮质 m0/m1)没有用于分支的 thumb2 扩展。但是 m3/m4(/m7) 可以。
-
@artlessnoise 有单独的“X 是什么?”与“我什么时候应该使用 X?”问题已经是一种常见的模式,因为有一个明确的逻辑区别。
add/addw是可怕的指令特定语法的一个特例——.n/.w可以被普遍回答(这里的问题和回答都没有提到特定的助记符,也不需要)。跨度>