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

Vor*_*rac 12 assembly arm

我们在里面write_four_registers_and_readback()和下一个指令是打电话delay(10):

004002a4:   b.n 0x4002f4 <write_four_registers_and_readback+172>
 78               delay(10);
Run Code Online (Sandbox Code Playgroud)

ARM指令集中我们了解到它b是分支,然后是两个字母的助记符

例:

CMP R1,#0 ; Compare R1 with zero and branch to fred
          ; if R1 was zero, otherwise continue
BEQ fred  ; to next instruction.
Run Code Online (Sandbox Code Playgroud)

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

这个数字是什么意思0x4002f4?它只是地址的绝对表示<>吗?或者别的什么 - 点4.4.3 Assembler syntax似乎没有解释.

设备是SAM4S和工具链是arm-none-eabi-gcc.

Not*_*hat 13

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

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

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

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

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