C函数与栈的理解

栈是一段内存空间,用来存储局部的变量,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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值