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