为什么gcc对于用户和内核级代码会产生不同的汇编结果

ali*_*our 0 c gcc arm function

我正在尝试学习arm体系结构中的函数调用语法,并且为用户模式应用程序和可加载内核模块编译了相同的代码。在附图中,您可以看到两种不同模式下相同功能的拆卸结果。我很好奇这种差异的原因。在此处输入图片说明

art*_*ise 7

您已经使用非常不同的选项编译了代码。第一个是ARM(仅32位),第二个是Thumb2(混合的16/32位)。请参阅侧面的十六进制操作码。Thumb2以紧凑的方式(16位编码)使用了前8个寄存器,因此调用接口是不同的。即,fp是r7对r12。这就是为什么您看到相同代码的不同调用序列的原因。

另外,第一个启用了性能分析(为什么插入__gnu_mcount_nc)。

它实际上与“内核”与“用户”代码无关。可以使用与内核使用类似的选项来编译用户代码。有许多gcc命令行选项会影响“调用界面”(搜索AAPCS以获取更多信息,以及gcc ARM选项帮助)。

相关:ARM链接和框架指针