反汇编观察C语言的子函数跳转和参数的传递

反汇编观察C语言的子函数跳转和参数的传递

C是高级语言,在使用的时候我们不知道其子函数的跳转和参数的传递原则,现在通过反汇编的方式带着大家观察一下,反汇编后的代码执行,与程序入堆栈的原理。

下面这个C代码是实现一个4个参数的加法运算。

正文

接着带该函数进行反汇编,在该命令下输入:arm-linux-gnueabi-gcc -S sum.c得到该汇编的代码。如下所示

汇编代码高能预警

在上面这段汇编中有几点说明:第一如果子函数的参数个数小于4个,那么直接将急促安琪R0,R1,R2,R3赋值给这四个参数,但是如果参数个数大于四个,就利用堆栈操作将参数进行压栈。

下面简略分析一下汇编代码,首先参数传递是四个参数,

 

接着,对这些进行跳转,BL sum,带连接的跳转。跳转到sum子函数,当从子函数中相加以后,保存在R0寄存器中,然后在跳出子函数进入主函数,通过bx lr,

接着对参数进行增加,从4个参数增加到6个参数。

这样参数的个数,就增加到6个,那么正如前面分析的一样,当参数个数增加大于4个以后,参数就放在堆栈中。再次反汇编观察如下:

可以看到前四个仍然还是原来,第五和第六的参数发生改变,进行入栈,如下所示:

 

老九学堂会员出品

作者:快乐的镜子

猜你喜欢

转载自www.cnblogs.com/ljxt/p/11579865.html