我可以在ARM程序集中的程序(PROC / ENDP)之外进行分支吗?

时间:2016-03-24 09:28:52

标签: assembly arm

文档对此保持沉默。如果我像这样编写代码并调用bar,会发生什么?是否有任何负面后果?

foo PROC
    ...
    BX    lr
    ENDP

bar PROC
    B     foo
    ENDP

更新

从技术上讲,做这些事情是完全合法的。代码编译并正常工作。正如有些人已经注意到目标文件中的某些元信息需要PROC指令。我担心通过这种方式使用它(如上例所示),我可能会“破坏”这些信息并带来未知后果。

该指令的描述说明

  

汇编程序在为ELF生成DWARF调用帧信息时使用PROC来标识函数的开头。 PROC将规范帧地址设置为R13(SP),帧状态堆栈为空。

我不擅长调试器如何工作,但如果我没有弄错,则调用帧意味着与堆栈相关的东西。因为我不在我的函数中使用堆栈,所以我可以得出结论,这些信息对我来说并不重要。我是对的吗?

2 个答案:

答案 0 :(得分:3)

PROC之类的注释是为了工具的利益 - 例如表示为该标签生成的ELF符号应标记为函数,而不是数据。您需要所有目标文件元信息用于链接,调试等,但除此之外,例如通知动态加载器如何以及在何处映射段,它与实际执行的代码和数据无关。

以另一种方式思考:函数调用本身只是一个分支,所以如果它在某种程度上不允许在指令集级别分支到“函数”之外,那么你实际可以编写什么样的有用代码? ;)

答案 1 :(得分:0)

这完全合法。编译器也有时会生成如下代码:

int foo(int x)
{
    return x*x*4 + x*7 + 1;
}

int bar(int x)
{
    printf("Hello bar");
    return foo(x);
}

这段代码非常可能被实现为从bar内跳转到foo,而不是调用并立即返回。