为什么 rsp 寄存器在叶函数中不像在任何其他函数的开头那样递减?

问题描述 投票:0回答:1

以下是有关我的系统的一些信息:

  • 在 Intel x86_64 上运行的 Ubuntu 22.04.3;
  • ggc版本11.4.0;

我注意到 rsp 寄存器在叶函数中并没有像在非叶函数中那样递减。

例如,考虑文件 test.c 中的这个 C 程序:

int fx(){
     
     int x = 30;
     int y = 34;
     int z = 45;
     return 30;  
}

int main(){    
    
    int a = 10;
    int b = 20;
    int c = fx();
     
}

用“gcc test.c -fno-stack-protector -o test”编译它后,我运行“objdump -dw -M suffix test”,我得到:

0000000000001129 <fx>:
    1129:   f3 0f 1e fa             endbr64 
    112d:   55                      pushq  %rbp
    112e:   48 89 e5                movq   %rsp,%rbp
    1131:   c7 45 fc 1e 00 00 00    movl   $0x1e,-0x4(%rbp)
    1138:   c7 45 f8 22 00 00 00    movl   $0x22,-0x8(%rbp)
    113f:   c7 45 f4 2d 00 00 00    movl   $0x2d,-0xc(%rbp)
    1146:   b8 1e 00 00 00          movl   $0x1e,%eax
    114b:   5d                      popq   %rbp
    114c:   c3                      retq   

000000000000114d <main>:
    114d:   f3 0f 1e fa             endbr64 
    1151:   55                      pushq  %rbp
    1152:   48 89 e5                movq   %rsp,%rbp
    1155:   48 83 ec 10             subq   $0x10,%rsp
    1159:   c7 45 fc 0a 00 00 00    movl   $0xa,-0x4(%rbp)
    1160:   c7 45 f8 14 00 00 00    movl   $0x14,-0x8(%rbp)
    1167:   b8 00 00 00 00          movl   $0x0,%eax
    116c:   e8 b8 ff ff ff          callq  1129 <fx>
    1171:   89 45 f4                movl   %eax,-0xc(%rbp)
    1174:   b8 00 00 00 00          movl   $0x0,%eax
    1179:   c9                      leaveq 
    117a:   c3                      retq  

如您所见,在 main 中我们有

subq $0x10,%rsp
但在
fx
中这不会发生。

我的问题:

  1. 这与gcc遵循的System V ABI有关还是只是编译器执行的优化?

  2. 造成这种行为的原因是什么?

  3. 有没有办法告诉编译器我不希望在叶函数中出现这种行为?

c ubuntu stack x86-64 abi
1个回答
0
投票

由于您不通过寄存器传递任何参数,并且不调用任何其他函数,因此保留堆栈空间是没有意义的。

void nn(int x);

int fx(void){     
     volatile int x = 30;

     nn(x);
     return 30;  
}

https://godbolt.org/z/7qE4nbdcn

© www.soinside.com 2019 - 2024. All rights reserved.