为什么堆栈指针使用ARM-Linux-gnueabi-GCC编译时,堆栈指针降低了4个字节的尺寸4个字节?

问题描述 投票:0回答:1
以下面的琐碎C程序为例。 main()调用函数以总和传递在4个整数中。 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; int z; int z2; x = a; y = b; z = c; z2 = d; }

在我的Ubuntu Server中12.04.04 LTS我使用
编译此程序

arm-linux-gnueabi-gcc -s -mthumbfunc.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, sp, #0 str r0, [r7, #12] str r1, [r7, #8] str r2, [r7, #4] str r3, [r7, #0] <- paramaters passed ldr r3, [r7, #12] str r3, [r7, #16] <- locals ldr r3, [r7, #8] str r3, [r7, #20] ldr r3, [r7, #4] str r3, [r7, #24] ldr r3, [r7, #0] str r3, [r7, #28] add r7, r7, #36 mov sp, r7 pop {r7} bx lr

看来Int是每个4个字节。  该功能的4个本地人和4个参数使得(4 * 4个字节) +(4 * 4个字节)= 32个字节,这与汇编输出“帧= 32”。

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

ARM的Procedure呼叫标准需要8个字节对齐。

5.2.1.2公共接口上的堆栈约束
assembly gcc arm armv7
1个回答
3
投票
堆栈还必须符合公共接口上的以下约束:

SPmod 8 = 0。堆栈必须双词对齐。

由于您正在制作组件,默认情况下所有内容都会导出,因此您可以得到8个字节对齐。是一个公共接口
    或GCC只是对齐每个功能都具有8字节堆栈对齐。)
  • 您可以使用
跳过推
.global <symbol>

,然后GCC应在32处离开堆栈深度。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.