• Linux学习之路一计算机是如何工作的


    初次接触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 ”

  • 相关阅读:
    [hadoop](2) MapReducer:Distributed Cache
    [hadoop](1) MapReduce:ChainMapper
    hadoop平台搭建
    postgresql主从同步配置
    问题记录-java图片验证码显示乱码
    windows mongodb启动
    新的开始
    springboot和Redis整合
    springboot的简单热部署
    springmvc模式下的上传和下载
  • 原文地址:https://www.cnblogs.com/casparzheng/p/4308365.html
Copyright © 2020-2023  润新知