初次接触MOOC课堂,里面有个很牛X的老师教Linux,恰好自己有兴趣学,顾有了此系列学习博文。
第一讲 计算机是如何工作的
学习Linux,涉及到了C语言和汇编以及操作系统的知识,顾第一讲要讲讲汇编的知识,C和操作系统知识自行复习。以下知识都是AT&T汇编的知识,可能与Intel汇编有些不同。
知识一:
Example instruction What it does
知识二:
有这些知识差不多就能看懂汇编了。现在给一个简单的C程序,main.c,然后让它编译成汇编程序,得到main.s。
实验运行环境:实验楼64位Linux虚拟机
//main.c
1 int g(int x) 2 { 3 return x + 333; 4 } 5 6 int f(int x) 7 { 8 return g(x); 9 } 10 11 int main(void) 12 { 13 return f(888) + 111; 14 }
编译命令为:gcc –S –o main.s main.c -m32 (其中-m32是将代码编译为32位的意思,因为该命令是在实验楼64位Linux虚拟机环境下使用的,32位Linux环境可能会稍有不同)。
以下是main.s代码,共25行。需要说明的是,编译后会出现很多以“.”开头的语句,这些都是起连接作用的,实际上是不执行的语句,顾可以把它们删除,得到纯净的汇编代码,如下:
接下来就是分析了。
从main函数开始。
18行,将%ebp压栈(其中%esp的值会自动减4,因为pushl操作等价于2行代码,可参考知识二);
19行,将%esp的值给%ebp,形成栈中栈的结构。(其中18,19行代码就是enter操作)
20行,21行,就相当于将888入栈。
22行,调用f()函数,首先将%eip入栈,然后将f()的地址赋值给%eip(说明:%eip所指的值为下一条代码执行的地址,所以将f()函数的地址给%eip,那下一次就会执行f()函数)。
18行--22行中的栈的内容的变化如下图
后续代码的栈变化类似,入栈、出栈、入栈、出栈……在此就不多加累赘了。
总结:
对于计算机是如何工作的,首先是将高级语言转换成汇编语言,接着将汇编语言理解成入栈、出栈操作。整个计算机的工作就是由不断的入栈,不断的出栈,外加一些简单的加减等操作所构成的。
注明:
博客署名:***
原创作品转载请注明出处
参考资料:
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”