func1:
pushq %rbp ; 新的栈帧,把上一个栈帧的rbp寄存器保存起来,新的栈帧要使用rbp来访问堆栈
movq %rsp, %rbp ; 保存新的栈顶
movl %edi, -20(%rbp) ; 获取参数,并保存在堆栈上
movl %esi, -24(%rbp) ; 继续保存在堆栈上
movl %edx, -28(%rbp) ; 继续保存在堆栈上
movl -20(%rbp), %edx ;
movl -24(%rbp), %eax
addl %eax, %edx ; 实现加法
movl -28(%rbp), %eax
addl %edx, %eax
movl %eax, -4(%rbp) ; 返回回去
movl -4(%rbp), %eax
popq %rbp
ret
main:
// 保存rbp寄存器,然后使用rbp保存新的栈顶寄存器,
pushq %rbp
movq %rsp, %rbp
// 开辟一段栈空间,用来保存局部变量
subq $16, %rsp
// 通过rbp来定位到对应栈空间
movl $10, -4(%rbp) ; args1,存放10
movl $4, -8(%rbp) ; args2, 存放4
movl $1, -12(%rbp) ; args3, 存放1
movl -12(%rbp), %edx // 第三个参数
movl -8(%rbp), %ecx
movl -4(%rbp), %eax
movl %ecx, %esi // 第二个参数
movl %eax, %edi // 第一个参数
call func1 // 函数调用
movl %eax, -16(%rbp)
movl -16(%rbp), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
ret