什么是.w和.n后缀添加到手臂装配说明?

时间:2014-11-26 10:42:58

标签: assembly arm

我们在write_four_registers_and_readback()内,下一条指令是致电delay(10)

004002a4:   b.n 0x4002f4 <write_four_registers_and_readback+172>
 78               delay(10);

ARM Instruction Set我们了解到b是分支,后跟两个字母的助记符

示例:

CMP R1,#0 ; Compare R1 with zero and branch to fred
          ; if R1 was zero, otherwise continue
BEQ fred  ; to next instruction.

但是这个.n似乎并没有被包含在两个字母的助记符表中......坦率地说,这也不是一个两个字母的助记符。它是什么意思。

此外,数字0x4002f4是什么意思?它只是<>中放置的地址的绝对表示吗?或者别的 - 点4.4.3 Assembler syntax似乎无法解释。

设备为SAM4S,工具链为arm-none-eabi-gcc

1 个答案:

答案 0 :(得分:12)

你有很古老的参考资料,但是现代工具链。当引入Thumb-2时,ARM还引入了一个新的Unified Assembler Language,它允许编写可以组装到ARM或Thumb的代码(可能)没有修改。大多数(如果不是全部)最近的工具链默认为UAL(尽管许多人仍然通过某种方式支持遗留语法)。

在UAL中,.n.w后缀适用于具有16位Thumb(&#34; narrow&#34;)和32位Thumb-2(&#)的助记符34;宽&#34;)编码 * 。如果未指定,汇编器将自动选择适当的编码,但是如果需要特定的编码(例如,强制32位编码,汇编器将选择16位版本以填充缓存对齐的代码),则后缀可以指定。

反汇编程序通常会发出后缀,以确保输出(如果通过汇编程序传回)将产生完全相同的目标代码。

那么,你所拥有的是一个16位Thumb分支指令来寻址0x4002f4,它恰好是符号write_four_registers_and_readback之后的172个字节。

*从技术上讲,所有ARM编码也都是&#34;宽&#34;,因此可能需要.w后缀,但在这种情况下它完全是多余的。