main:
//保存调用者栈基地址,并为main()函数分配新栈空间
pushl %ebp //保存调用者(这里是操作系统)的栈基地址,%ebp栈底
movl %esp, %ebp //将调用者的栈基地址指向其栈顶,%esp栈顶
subl $32, %esp //将当前栈顶减去32个字节,为main()函数分配32个字节栈空间
movl $5, 20(%esp) //将把5存入当前栈顶往上移动20字节位置
movl %3, 24(%esp) //将把5存入当前栈顶往上移动24字节位置
movl 24(%esp), %eax //将24(%esp)处的内存值传送到eax寄存器中
movl %eax, 4(%esp) //将eax寄存器中的值传送到了4(%esp)处
movl 20(%esp), %eax //将20(%esp)处的内存值传送到eax寄存器中
movl %eax, (%esp) //将eax寄存器中的值传送到了(%esp)处,即栈顶
call add //调用add函数
movl %eax, 28(%esp) //将eax寄存器的值传送到28(%esp)处
movl $0, %eax //将0传送到寄存器eax里
leave
ret
add:
pushl %ebp //保存调用者(这里是main函数)的栈基地址,%ebp栈底
movl %esp, %ebp //将调用者的栈基地址指向其栈顶,%esp栈顶
subl $16, %esp //将当前栈顶(位置已经发生了变化,指针指向了为main新增的8个字节的方法栈顶)减去16个字节,为add()函数分配16个字节栈空间
movl 12(%ebp), %eax //将当前栈底往高低址方向偏移12个字节处(即main函数存放的4(%esp))的数据取出,并传送给eax寄存器
movl 8(%ebp), %edx //将当前栈底往高低址方向偏移8个字节处(即main函数存放的(%esp))的数据取出,并传送给eax寄存器
addl %edx, %eax //将edx寄存器的数据与eax寄存器的数据相加,并将结果存入eax寄存器里
movl %eax, -4(%ebp) //将eax寄存器的数据放入当前栈底往低地址4个字节处
movl -4(%ebp), %eax //将当前栈底往低地址4个字节处数据放入eax寄存器
leave
ret