汇编函数与c函数互相调用问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Longyu_wlz/article/details/83180808

汇编函数与c函数的互相调用问题

从函数定义的角度来看,汇编函数与c函数都是执行流的基本单位,两者没有太大的区别。从操作对象来看,汇编函数中的指令都是直接操作寄存器完成的,c函数中的语句是通过操作变量(可能在寄存器中,大部分时间中都在内存中例如ram、cache)。

从c函数调用汇编函数首先需要对汇编函数进行声明,需要注意的是传递给汇编函数的参数所对应的寄存器,以及汇编函数返回值如何获取。在 arm 中一般使用 r0 寄存器来保存返回值,所以在汇编函数中只要设置了 r0 寄存器的值就等于完成了传递返回值的过程。

从汇编函数中调用c函数相对复杂,你特别要注意保存现场与恢复现场的问题,这里的现场特指函数执行依赖的寄存器的当前状态。你也需要自己完成 c 函数参数的传递过程。

在 arm 中,从汇编函数中调用 c 函数可以有多种实现,你可以使用多种跳转指令来实现,这些跳转指令有各自的使用情况,有些能够直接跳转,有些只能够间接跳转,有些会修改链接寄存器的值,有些甚至会切换处理器的状态(这常常是高深的技巧)。

特别需要注意的是使用不同跳转指令的情况。

BL 与 BLX 指令会将下一条指令的地址放到 LR (链接寄存器)中,如果 c 函数的汇编指令中也调用了 BL 与 BLX 指令,那么你需要在汇编函数中将 LR 入栈,c 函数返回后出栈,这样就能够保证汇编函数能够回到下一行指令的位置,这一点至关重要,常常会是问题所在。BX 与 BLX 能够将处理其的状态从 ARM 态切换为 Thumb状态,这是一个高级技巧,这里我就不多讲了。

你还需要注意的是,这些跳转指令一般都存在着跳转范围,不能超过范围进行跳转。
你可以从 ARM 分支指令 中查看每一个跳转指令的跳转范围。

从 x86 汇编中调用 c 函数的一个示例详见 从汇编中调用 c 函数

猜你喜欢

转载自blog.csdn.net/Longyu_wlz/article/details/83180808