窦猛汉 原创作品转载请注明出处 :《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC1000029000
计算机的工作原理
计算机在运行时,CPU根据IP存放的指令地址先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去,这个过程中IP自动指向下一条指令。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。 程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作原理。这一原理最初是由美籍匈牙利数学家冯.诺依曼于1945年提出来的,故称为冯.诺依曼原理。
汇编代码
C程序代码命名为main.c,然后执行一条命令生成对应的汇编代码:
gcc -S -o main.s main.c -m32
copy
其中-S选项表示在生成汇编代码,-o选项表示输出编译结果,即输出汇编代码至main.s文件中,-m32则表示生成32位的汇编代码
说明汇编语言的执行过程
先从main 函数开始解释
1:
pushl %ebp
copy
压栈操作,把ebp的值入栈,此时esp减4;
2:
movl %esp, %ebp
copy
寄存器操作,表示把esp中的值赋给ebp;
3:
subl $4, %esp
copy
表示把esp中的值减4;
4:
movl $22, (%esp)
copy
表示把22存入esp指向的内存块中;
5:
call f
copy
call f 可分为两步;
(1)pushl %eip
(2)movl $0x....,%eip
copy
其中第一小步是把eip中的地址入栈,此时esp减4,第二小步是把地址 $0x...(f函数的栈基地址) 赋给eip,下一次执行的指令就开始从f函数开始;
6:
pushl %ebp
movl %esp, %ebp
copy
这两句的意思是 保存上一个函数的栈顶指针,把ebp指向当前esp指向的地址作为新函数的栈顶指针;
7:
subl $4, %esp
movl 8(%ebp), %eax
copy
这两句的意思是栈底指针esp减4,然后把(%ebp+8)地址中的内容赋予eax中;
8:
movl %eax, (%esp)
copy
将eax中的值存储到esp指向的位置,即把22保存到esp指向的地址中;
9:
call g
copy
10:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
copy
第三句的意思就是把22 放到eax中;
11:
addl $10, %eax
copy
用10加上eax的内容再赋给eax;
12:
popl %ebp
copy
出栈操作,把出栈的数据赋给ebp;
13:
ret
copy
ret的意思是``` popl %eip
14:
copy
leave ret
leave可以分为两行汇编代码
copy
movl %ebp,%esp popl %ebp
把当前函数的栈顶地址赋给栈底指针esp,取回上一层函数的栈顶地址;
ret实现返回main函数的功能;
15:
copy
addl $1,%eax
给eax中的值加1
16:
copy
leave ret
``` 总结
通过分析C程序编译后的汇编代码,学习了汇编代码,熟悉和认识了计算机的工作流程,并认识到在函数调用中,栈起了很重要的作用。
学习时间 44分钟
操作时间 30分钟
按键次数 1307次
实验次数 6次
报告字数 1777字
是否完成 完成