我们在里面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后缀,但在这种情况下它完全是多余的.