在大学就对Linux很感兴趣。记得当时装各种Linux玩,但玩了一段时间之后感觉自己没有深入进去。想好好研究一下内核和架构之类的也没什么时间了。毕业之后工作也把这事丢到一边了,最近看到MOOC学院有这门课程,所以果断报了,不管最后怎么样,好歹把心愿了一下。好了言归正传。本文是课程的作业。程序源代码如图
用gcc编译后得到汇编代码
为了便于分析去掉辅助代码
分析:
pushl %ebp 把基址寄存器的值保存到堆栈, %esp自动指向下一个堆栈地址。
movl %esp, %ebp 把堆栈指针保存到基址寄存器中。
subl $4, %esp 使堆栈指针指向下一个内存地址。
movl $18, (%esp) 把立即数18放到堆栈指针所指的内存中。
call f 调用函数f。eip入栈。
pushl %ebp 把基址寄存器的值保存到堆栈, %esp自动指向下一个堆栈地址。
movl %esp, %ebp 把堆栈指针保存到基址寄存器中。
subl $4, %esp 使堆栈指针指向下一个堆栈地址。
8(%ebp), %eax 把18放到eax寄存器中。
movl %eax, (%esp) 把eax寄存器中的值放到%esp指向的堆栈地址中。
call g 调用函数g。 eip入栈。
pushl %ebp 把基址寄存器的值保存到堆栈, %esp自动指向下一个堆栈地址。
movl %esp, %ebp 把堆栈指针保存到基址寄存器中。
8(%ebp), %eax 把18放到eax寄存器中。
addl $3, %eax 18 + 3。
popl %ebp 弹出%ebp。
ret 弹出eip的值。即函数f的leave
leave 把ebp的值给esp, 弹出ebp。
ret 弹出eip的值。即addl $1, %eax的位置。
addl $1, %eax 1 + eax中的值。即最后结果保存在eax中
leave 把ebp的值给esp, 弹出ebp。
ret 弹出eip的值。main函数之前eip的指令位置。
计算机的工作原理: 通过取指令,取数据,运算,变址等操作来完成一系列的工作流程。
马云鹏原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-10000290