----------------------------------------------------------------------------------------------------------------------------------------
本文为《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000。第一课课后作业。学生姓名:刘征
本文主要内容是写一个简单的C语言程序,将其转换成汇编代码后,分析其中栈的变化。如果有错误,请您提出宝贵的意见,谢谢。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
在分析代码之前,先讲一下基础的汇编语言:
1、movl %eax, %edx //edx=eax (寄存器寻址与内存无关)
2、movl $0x123, %edx //edx=0x123 (立即寻址)
3、movl 0x123, %edx //edx=*(int32_t *)0x123
4、movl (%ebx), %edx //edx=*(int32_t *)ebx
5、movl 4(%ebx), %edx //edx = *(int32_t * ) (ebx+4)
6、pushl %eax //subl $4, %esp
//movl %eax, (%esp)
7、popl %eax //movl (%esp), %eax
//addl $4, %esp
8、ret //popl %eip
一、建立一个C程序并将其转为汇编文件
1、打开Linux虚拟机,使用vi main.c命令在编辑器中编辑代码如下:
2、在Linux虚拟机中将其转换成汇编文件,并命名为main.s
3、整理得到main.s汇编代码
二、分析汇编代码中栈的变化情况
三、总结
计算机的基本原理是存储程序和程序控制。预先要把指挥计算机如何进行操作的指令序列(称为程序)和原始数据通过输入设备输送到计算机内存贮器中。每一条指令中明确规定了计算机从哪个地址取数,进行什么操作,然后送到什么地址去等步骤。 计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。 程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作原理。这一原理最初是由美籍匈牙利数学家冯.诺依曼于1945年提出来的,故称为冯.诺依曼原理。(来自百度百科)