使用arm-linux-gnueabi-gcc编译时,为什么堆栈指针比堆栈帧大小下移4个字节?

使用arm-linux-gnueabi-gcc编译时,为什么堆栈指针比堆栈帧大小下移4个字节?,第1张

概述以下面的简单C程序为例. main()对4个整数传递的sum进行函数调用. sum()使用4个本地人. void sum(int a, int b, int c, int d);void main(void){ sum(11, 12, 13, 14);}void sum(int a, int b, int c, int d){ int x; int y; 以下面的简单C程序为例. main()对4个整数传递的sum进行函数调用. sum()使用4个本地人.

voID sum(int a,int b,int c,int d);voID main(voID){    sum(11,12,13,14);}voID sum(int a,int d){    int x;    int y;    int z;    int z2;    x = a;    y = b;    z = c;    z2 = d;}

在我的ubuntu服务器12.04.04 LTS上我使用编译该程序

arm-linux-gnueabi-gcc -S -mthumb func.c

sum:@ args = 0,pretend = 0,frame = 32@ frame_needed = 1,uses_anonymous_args = 0@ link register save eliminated.push    {r7}sub sp,sp,#36    <===   why is this 36 and not 32 bytes?add r7,#0str r0,[r7,#12]str r1,#8]str r2,#4]str r3,#0]   <- paramaters passedldr r3,#12]str r3,#16]  <- localsldr r3,#8]str r3,#20]ldr r3,#24]ldr r3,#0]str r3,#28]add r7,r7,#36mov sp,r7pop {r7}bx  lr

似乎int是每个4个字节.该函数的4个locals和4个参数总共(4 * 4字节)(4 * 4bytes)= 32字节,这与汇编输出“frame = 32”匹配.

但是为什么堆栈指针会减少36而不是32?

解决方法 ARM的过程调用标准需要8字节对齐.

5.2.1.2 Stack constraints at a public interface

The stack must also conform to the following constraint at a public interface:

SP mod 8 = 0. The stack must be double-word aligned.

由于您正在生成程序集,因此默认情况下会导出所有内容,因此您将获得8字节对(我试过这个并且gcc在生成汇编时没有向静态函数添加.global< symbol>指令.我想这甚至说静态函数是公共接口或者gcc只是将每个函数对齐以具有8字节堆栈对齐. )

You can use -fomit-frame-pointer跳过按r7然后gcc应该将堆栈深度保持在32.

总结

以上是内存溢出为你收集整理的使用arm-linux-gnueabi-gcc编译时,为什么堆栈指针比堆栈帧大小下移4个字节?全部内容,希望文章能够帮你解决使用arm-linux-gnueabi-gcc编译时,为什么堆栈指针比堆栈帧大小下移4个字节?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1018040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存