文档对此保持沉默。如果我像这样编写代码并调用bar
,会发生什么?是否有任何负面后果?
foo PROC
...
BX lr
ENDP
bar PROC
B foo
ENDP
更新
从技术上讲,做这些事情是完全合法的。代码编译并正常工作。正如有些人已经注意到目标文件中的某些元信息需要PROC
指令。我担心通过这种方式使用它(如上例所示),我可能会“破坏”这些信息并带来未知后果。
该指令的描述说明
汇编程序在为ELF生成DWARF调用帧信息时使用PROC来标识函数的开头。 PROC将规范帧地址设置为R13(SP),帧状态堆栈为空。
我不擅长调试器如何工作,但如果我没有弄错,则调用帧意味着与堆栈相关的东西。因为我不在我的函数中使用堆栈,所以我可以得出结论,这些信息对我来说并不重要。我是对的吗?
答案 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,而不是调用并立即返回。