int add(int a, int b)
{
int d;
d = 20;
return (a + d + b);
}
int main()
{
int a, b, c;
a = 16; b = 32;
c = add(a, b);
return c;
}
.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)