要确定ADR x9,sub_xxxxxx是否调用了一个子程序,可以查看代码中是否有跳转指令或者函数调用相关代码。
在ARM汇编中,函数调用通常使用BL指令,该指令将当前PC(程序计数器)的值保存到链接寄存器(LR)中,并将要跳转的地址存储到PC中。因此,可以搜索代码中是否有类似于"BL sub_xxxxxx"的指令,其中sub_xxxxxx是一个标签或地址。
如果找到了这样的指令,那么说明ADR x9,sub_xxxxxx调用了一个子程序。
至于为什么代码使用ADR / NOP,这取决于具体的上下文和代码逻辑。ADR指令用于将标签或全局符号的地址加载到寄存器中,而NOP指令是一个空操作指令,通常用于填充指令流以保持对齐或延迟执行。
以下是一个示例代码,演示了ADR x9,sub_xxxxxx的使用和函数调用的示例:
ADR x9, sub_xxxxxx ; 将sub_xxxxxx的地址加载到寄存器x9中
...
BL x9 ; 调用子程序
...
sub_xxxxxx:
...
RET ; 子程序返回
在这个示例中,ADR指令将sub_xxxxxx的地址加载到寄存器x9中,然后使用BL指令调用该子程序。具体代码逻辑和使用ADR / NOP的原因可能因实际情况而异。