1. int add(int a, int b)
  2. {
  3. int d;
  4. d = 20;
  5. return (a + d + b);
  6. }
  7. int main()
  8. {
  9. int a, b, c;
  10. a = 16; b = 32;
  11. c = add(a, b);
  12. return c;
  13. }
.file   "main.c"
    .text
    .globl  add
    .type   add, @function
    add:
.LFB0:
.cfi_startproc
    pushq   %rbp                保存rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp          将stack pointer mv 到frame pointer
    .cfi_def_cfa_register 6        
    movl    %edi, -20(%rbp)     将edi (16) move 到 rbp(-20)? 这里为什么是-20 为什么                                 不用先sub?
    movl    %esi, -24(%rbp)     将esi (32) move 到 rbp(-24)
    movl    $20, -4(%rbp)       将20 mov到 rbp(-4)   
    movl    -20(%rbp), %edx     16 mov 到 edx
    movl    -4(%rbp), %eax      20 mov 到 eax
    addl    %eax, %edx          (16 + 20)-> edx
    movl    -24(%rbp), %eax      32 mov 到 eax
    addl    %edx, %eax           36 + 32 -> eax
    popq    %rbp                 pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
    .LFE0:
.size   add, .-add
.globl  main
.type   main, @function

main:
.LFB1:
.cfi_startproc
    pushq   %rbp              保存 frame point rbp
    .cfi_def_cfa_offset 16   
    .cfi_offset 6, -16
    movq    %rsp, %rbp        将 stack point rsp move 到 rpb
    .cfi_def_cfa_register 6   
    subq    $16, %rsp         分配 8 * 2 byte 在栈上 (栈顶往下)
    movl    $16, -4(%rbp)     将16 move到 rbp - 4 的位置
    movl    $32, -8(%rbp)     将32 move到 rbp - 8 的位置
    movl    -8(%rbp), %edx    将 32 move到 edx
    movl    -4(%rbp), %eax    将 16 move到 eax
    movl    %edx, %esi        将edx的值(32) mov 到esi 
    movl    %eax, %edi        将eax的值(16) mov 到edi
    call    add               call add
    movl    %eax, -12(%rbp)
    movl    -12(%rbp), %eax
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
    .LFE1:
.size   main, .-main
.ident  "GCC: (GNU) 10.2.1 20200826 (Red Hat 10.2.1-3)"
    .section        .note.GNU-stack,"",@progbits

问题

movl    -8(%rbp), %edx    将 32 move到 edx<br />    movl    -4(%rbp), %eax    将 16 move到 eax<br />    movl    %edx, %esi        将edx的值(32) mov 到esi <br />    movl    %eax, %edi        将eax的值(16) mov 到edi<br />这里不能直接mov到 esi?要先到edx再到esi?

movl %edi, -20(%rbp) 这里为什么是-20 为什么不用先sub 将rsp往下移??
movl %esi, -24(%rbp) 将esi (32) move 到 rbp(-24)
movl $20, -4(%rbp) 将20 mov到 rbp(-4)