堆栈平衡


1 #include <stdio.h> 2 #include <unistd.h> 3 4 int abc() { 5 int d; 6 return 2; 7 } 8 int sum(int a) { 9 int c; 10 abc(); 11 return a; 12 } 13 int main() { 14 int b = 0; 15 b = sum(1); 16 printf("hello:%d\n", b); 17 return 0; 18 } 1 .file "test.c" 2 .text 3 .globl abc 4 .type abc, @function 5 abc: 6 pushq %rbp 7 movq %rsp, %rbp 8 movl $2, %eax 9 popq %rbp 10 ret 11 .size abc, .-abc 12 .globl sum 13 .type sum, @function 14 sum: 15 pushq %rbp 16 movq %rsp, %rbp 17 subq $8, %rsp 18 movl %edi, -4(%rbp) 19 movl $0, %eax 20 call abc 21 movl -4(%rbp), %eax 22 leave 23 ret 24 .size sum, .-sum 25 .section .rodata 26 .LC0: 27 .string "hello:%d\n" 28 .text 29 .globl main 30 .type main, @function 31 main: 32 pushq %rbp 33 movq %rsp, %rbp 34 subq $16, %rsp 35 movl $0, -4(%rbp) 36 movl $1, %edi 37 call sum 38 movl %eax, -4(%rbp) 39 movl -4(%rbp), %eax 40 movl %eax, %esi 41 movl $.LC0, %edi 42 movl $0, %eax 43 call printf 44 movl $0, %eax 45 leave 46 ret 47 .size main, .-main 48 .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609" 49 .section .note.GNU-stack,"",@progbits

https://blog.csdn.net/kingzone_2008/article/details/44544285

分析一下堆帧:

 1.call main 初始化:

 

 

 

2. main  

 pushq   %rbp    //会使rsp=rsp+4  存入调用main 之前的栈帧

 movq    %rsp, %rbp

 

 

 

3.分配临时变量

 subq    $16, %rsp

 movl    $0, -4(%rbp)

 movl    $1, %edi

 call    sum

 

 

 

4. sum

pushq %rbp         //存入调用main 的栈帧

movq %rsp, %rbp 

 

 

5. 

subq $8, %rsp

call abc

pushq   %rbp

movq    %rsp, %rbp

 

 

 

 

6. abc 回退栈帧

popq %rbp

ret 

 

 

7 回退sum

leave 

ret 

 

 

 

8 回退main

 

posted @ 2020-04-20 15:01  通杀  阅读(643)  评论(0编辑  收藏  举报