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”匹配.
解决方法 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个字节?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)