Linux   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用arm-linux-gnueabi-gcc编译时,为什么堆栈指针比堆栈帧大小下移4个字节?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

以下面的简单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;
@H_696_14@
@H_696_14@
以下面的简单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,#0

str r0,[r7,#12]
str r1,#8]
str r2,#4]
str r3,#0]   <- paramaters passed

ldr r3,#12]
str r3,#16]  <- locals
ldr r3,#8]
str r3,#20]
ldr r3,#24]
ldr r3,#0]
str r3,#28]

add r7,r7,#36
mov sp,r7
pop {r7}
bx  lr

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

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

解决方法

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

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

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

@H_696_14@ @H_696_49@

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:4armgccgnueabilinux下移为什么使用堆栈大小字节指针编译
猜你在找的Linux相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap