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公共接口上的堆栈约束
SPmod 8 = 0。堆栈必须双词对齐。由于您正在制作组件,默认情况下所有内容都会导出,因此您可以得到8个字节对齐。是一个公共接口
或GCC只是对齐每个功能都具有8字节堆栈对齐。)
跳过推- 您可以使用
.global <symbol>
,然后GCC应在32处离开堆栈深度。