Linux及安全 内核分析计算机是如何工作的
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一、实验内容:
通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
二、实验过程:
在Linux模拟器上,打开一个shell命令运行器,在Code文件夹中建立一个c文件,用vi命令运行,打开main.c文件,输入一个简单的c程序,用gcc -S -o main.s main.c -m32,将C程序反汇编,用vi命令打开main.s,分析汇编语言。
三、实验截图:
1.shell命令:
2.一个简单的c程序:
3.反汇编结果:
四、代码分析:
1.c语言分析:
int g( int x ){
return x + 7;
}
int f( int x ){
return g(x);
}
int main( void ) {
return f(7) + 7;
}
main函数调用f(x)函数,f函数调用g函数,g函数将自变量加7后返回,返回到main函数后,再将结果加7后返回。
2.汇编语言分析:
g:
pushl %p ;栈底入栈
movl %esp, %p ;置空站
movl 8(%p), %x ;栈底上移两位,然后将所指位置的值传给eax
addl $7, %x ;加7
popl %p ;栈底出栈
ret ;返回
f:
pushl %p ;栈底入栈
movl %esp, %p ;置空站
subl $4, %esp ;栈顶下移一位
movl 8(%p), %x ;栈底上移两位,然后将所指位置的值传给eax
movl %x, (%esp) ;;将eax的值传给栈顶所指的位置
call g ;调用g函数
leave ;f函数执行完毕
ret ;返回
main:
pushl %p ;栈底入栈,esp - 4
movl %esp, %p ;将esp的值赋给ebp,ebp - 4, 然后esp 与 ebp指向同一位置
subl $4, %esp ;esp ;下移一位
movl $7, (%esp) ;将立即数4给esp
call f ;调用f函数
addl $7, %x ;将返回值再加7
leave ;主函数执行完毕
ret ;返回
五、实验总结:
通过这次实验,我重新复习了汇编的相关知识,对于一些汇编基础知识的理解变得更加透彻。通过反汇编一个简单的c程序,我也大致明白了计算机是怎样执行指令与指令是怎样转换成计算机所能理解的最简单语言的。另外,在这次试验中我也重温了栈的结构,各个寄存器的用途以及计算机是如何执行反汇编的,收获颇丰。O(∩_∩)O