栈是一段内存空间,用来存储局部的变量,sp寄存器值是这片空间的基址,大小是编译的时候算出来的。
下面的例子直观的说明了这一点:
test.c:
#include <stdio.h>
#include <stdlib.h>
int sum2(int a, int b)
{
return a + b;
}
int sum1(int a, int b)
{
return (sum2(a, b));
}
int main(int argc, char **argv)
{
int a = 5;
int b = 6;
sum1(a, b);
return 0;
}
arm-linux-gnueabi-gcc -march=armv4t -S test.c -emain -fomit-frame-pointer -O0
.arch armv4t
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "test.c"
.text
.align 2
.global sum2
.syntax unified
.arm
.fpu softvfp
.type sum2, %function
sum2:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
sub sp, sp, #8
str r0, [sp, #4]
str r1, [sp]
ldr r2, [sp, #4]
ldr r3, [sp]
add r3, r2, r3
mov r0, r3
add sp, sp, #8
@ sp needed
bx lr
.size sum2, .-sum2
.align 2
.global sum1
.syntax unified
.arm
.fpu softvfp
.type sum1, %function
sum1:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
str lr, [sp, #-4]!
sub sp, sp, #12
str r0, [sp, #4]
str r1, [sp]
ldr r1, [sp]
ldr r0, [sp, #4]
bl sum2
mov r3, r0
mov r0, r3
add sp, sp, #12
@ sp needed
ldr lr, [sp], #4
bx lr
.size sum1, .-sum1
.align 2
.global main
.syntax unified
.arm
.fpu softvfp
.type main, %function
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 16
@ frame_needed = 0, uses_anonymous_args = 0
str lr, [sp, #-4]!
sub sp, sp, #20
str r0, [sp, #4]
str r1, [sp]
mov r3, #5
str r3, [sp, #8]
mov r3, #6
str r3, [sp, #12]
ldr r1, [sp, #12]
ldr r0, [sp, #8]
bl sum1
mov r3, #0
mov r0, r3
add sp, sp, #20
@ sp needed
ldr lr, [sp], #4
bx lr
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0"
.section .note.GNU-stack,"",%progbits