Linux Kernel - C语言对应汇编源代码分析
重点知识总结
- CS(code segment register)是代码段寄存器,CPU在实际取指令时根据cs:eip来准确定位一个指令。
- b,w,l,p,分别指8位,16位,32位,64位,如movl指移动32位的数据。
- AT&T汇编格式与Intel汇编格式略有不同,Linux使用的是AT&T汇编格式。
- eip寄存器不能被直接修改,只能通过特殊指令间接修改,如通过call与ret指令。
- 函数的返回值默认使用eax寄存器存储返回给上一级函数
-
汇编中对应的方法过程如下
method: enter // Real Code Here leave ret
-
指令实际做的事情列表:
push %eax subl $4, %esp movl %eax, (%esp) pop %eax movl (%esp), %eax addl $4, %esp call 0x12345 pushl %eip* /* 这里eip后面的*意在说明这条指令实际不存在,是伪指令,下同 */ movl $0x12345, %eip* ret popl %eip* enter pushl %ebp movl %esp, %ebp leave movl %ebp, %esp popl %ebp
实验分析
C程序源代码如下图
汇编源代码如下图
从图中可以看出,C程序方法对应的汇编方法一般过程如下:
method:
enter
// Real Code Here
leave
ret
若方法中不再调用另一方法也即汇编代码中不调用call语句,那么leave
语句可优化为popl %ebp
。
参数传递通过堆栈完成,一个参数,则通过8(%ebp)
取参数,两个参数则通过12(%ebp)
, 8(*ebp)
分别取出第一和第二个参数。
wdk 原创作品转载请注明出处
相关链接 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000