也许有的同学喜欢用汇编语言来实现操作系统,觉得用汇编来写程序似乎更简单直接,可控性比较强,有种“一切尽在掌握”的赶脚。而用c语言实现操作系统这件事,虽然轻松很多,但似乎隐约感觉到有些慌张。因为虽然c语言相对来说更接近于人的逻辑思维,但恰恰是这种优越性,给一些好学的同学带来了困扰,毕竟咱们是在写底层的软件,必须要随心所欲地控制cpu,要时时刻刻知道cpu在干什么。而感觉上,c语言不能直接控制cpu,比如无法直接控制寄存器,这里面有太多的黑盒子,无法掌控的东西似乎有很多,不知道编译器在后面是怎么将我的逻辑思维转换成机器指令的。这种黑盒式的操作确实让人觉得神秘又不放心。

不同语言应用在不同的层级,各层级有不同的思维方式,c语言运用在更高的层级上,它的一行代码相当于多行汇编语言代码,因此c语言的语法对于汇编语言来说类似于一种需求。汇编语言相对来说运用在较低层级上,它是为完成宏观需求的具体步骤,在程序语言层面,汇编语言可以认为是不能再细分的最基本的原子。应用不同层级的语言,我们只要运用那个层级的思维即可。c语言和汇编语言的关系就像产品经理和开发人员那样,产品经理在设计一款产品时,只需要提出需求,这是站在“高层”上的开发,而开发人员要将需求转换为具体的代码,需要在微观上细化那些“高层”的需求,对于这款产品来说,无论是产品经理还是开发人员,他们都在自己的层级上开发。一个是以需求为粒度做开发,另一个是以代码为粒度做开发,一个是在“高层上”思考提哪些需求,另一个是在“底层上”思考如何满足需求。

汇编指令与机器指令几乎是一对一的,即一名汇编代码只对应一句具体的机器码,不会有更多对应的选择,所以可以认为汇编指令就是机器指令。c语言的编译过程是先将c语言代码转换成汇编代码,然后再将汇编代码转换成机器指令。所以用c语言写出来的程序,最终是可以转换成对应的一句或多句汇编指令。它们的关系就好比出租车上的乘客和司机,乘客只要告诉司机想去哪里就行了,其它的工作由司机和车共同配合完成。比如乘客说要去北京大学南门,司机根据当前的位置计算相对路径,比如先开车直行1公里,在路口处左转,再直行2公里后右转弯就到达了北京大学南门。乘客要去北京大学南门的这个需求就相当于c语言代码,这是上层需求。司机相当于编译器,由它将客户需求转换成具体的实现步骤,比如转换成踩油门直行、左转方向盘拐弯、再踩油门直行、再右转方向盘拐弯这四个驾驶操作,当然,司机只是发号施令,并不是司机在跑,真正把乘客带到目的地的工作者是出租车。出租车相当于cpu,由它最终落实司机的驾驶操作,将乘客带到目的地,司机的这些驾驶操作相当于机器指令。站在乘客的角度,它只是说了一句话,就让汽车做了加油门、转弯等多个微操作,这就是c和机器指令之间的关系。

不知道我这样举例子是否打消了您的疑虑,总之我们用c语言写程序,一定要充分相信c编译器的工作。也许有人曾经想过,写操作系统已经是底层的事了,做底层的事就应该用更底层的东西来实现,必须用汇编语言或比汇编语言还要低层的东西。这种想法我非常理解,我学习之初也曾有过类似的猜想。当然,确实可以用更原始的东西来实现操作系统,但那样也更麻烦,需要极大的耐心和良好的体格,哈哈。语言只是个工具,对机器而言,它能接受的是机器指令,只要最终交给机器的是机器指令就成了。而c语言这种高级语言是可以被编译成机器指令的,就是我们平时编译出来的二进制文件,它里面都是二进制的机器指令,cpu处理起来完全没有问题。选择哪种语言,只是实现的途径不同,最终还是汇总到机器指令那里。就像吃饭用筷子还是用勺子一样,饭最终还是被送到了嘴里。如果您对此还是觉得很模糊,可以想想咱们平时炒菜的过程,一般炒菜时都要放酱油吧,酱油本身就是个高级的东西,它也是被其它的一些农做物制作出来的(比如一般的酱油是用大豆制作的),咱们不也是直接拿来就用吗,有哪位同学因不清楚酱油的制作过程而不敢用酱油啦。炒菜时加酱油和用c语言写操作系统是同一个道理,都是以高级的东西为基础来创建新的东西。

如果以上三段内容并没有解开您的疑惑也不要着急,这一切都会在今后的c语言编程中理解,由量变到质变,您的问题自然就解决了。

本节内容摘自《操作系统真象还原》,请大家支持正版。

一步步编写操作系统 43 汇编语言和c语言的理解相关推荐

  1. 一步步编写操作系统 69 汇编语言和c语言共同协作 70

    由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...

  2. 软件工程:汇编语言和C语言在软件工程的应用,计算机学生必看!

    随着科学技术不断发展,软件工程在社会发展中取得了进一步发展,软件工程专业,也在各大学生根发芽,许多大学的专业教学上也取得了良好的进展.汇编语言与C语言作为两种计算机基础语言,在推动软件工程发展等方面具 ...

  3. 汇编语言属于C语言吧,汇编语言和c语言的区别是什么

    区别:汇编语言的效率高,对硬件的可操控性更强,体积小,不易维护,可移植性很差:c语言的效率比较低,硬件可操控性比较差,目标代码体积大,容易维护,可移植性很好. 汇编语言(Assembly Langua ...

  4. 汇编语言和C语言编写程序各有什么优缺点,C语言和汇编语言在单片机开发中,各有什么优缺点?...

    您好,下面这个是我从论坛里面找出来的精华帖.你可以参考参考. C与汇编: C:经编译后,成汇编. 汇编:是自己"完成"了C的工作. C:是从通用化出发的,考虑了单片机的特点,极大地 ...

  5. 一步步编写操作系统 66 浅析c库函数与系统调用1

    本来说好的接下来的工作是要去"丰满"我们的内核,可咱们这种一步一回头的学习方式还得继续啊.其实我了解大家急切写内核的心情,但本书<操作系统真象还原>(请大家支持正版)的 ...

  6. 一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

    一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法.咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量.如今我们要写一个打印函数了, ...

  7. 一步步编写操作系统 62 函数调用约定

    由于我们要将c语言和汇编语言结合编程啦,所以一定会存在汇编代码和c代码相互调用的问题,有些事情还是要提前交待给大家的,本节就是要给大家说下函数调用规约中的那些事儿. 函数调用约定是什么? 调用约定,c ...

  8. 一步步编写操作系统 2 部署工作环境 2

    1.22汇编语言编译器新贵,NASM "新"是相对于旧来说的,老的汇编器MASM和TASM已经过时了,从名称上可以看出字母n是在m之后,其功能必然有所超越才会被大家接受. 请用一句 ...

  9. c++和java哪个好学_【技术科普】C语言和java语言有些什么区别?

    C语言和java语言有些什么区别? 可以打个比方吧: C语言就像一个初创公司的老板,由于人少经费少,从技术.财务.市场等都需要自己管,经常把自己累的跟狗一样: Java语言就像一个上市大公司的老板,人 ...

最新文章

  1. 关于CSS3的filter(滤镜) 属性
  2. vue 带全选和多选的表格怎么写_vue中使用计算属性巧妙的实现多选框的“全选”...
  3. pytorch系列 ---5以 linear_regression为例讲解神经网络实现基本步骤以及解读nn.Linear函数
  4. xfce4的面板只能看见日期没法看见具体时刻
  5. Byte和byte[]数组
  6. ASP.NET Core Web程序托管到Windows 服务
  7. oracle视图执行脚本,Sh脚本中查询Oracle v$视图时需要在$号前加转义符“\”
  8. php表单验证内容不能为空,php校验表单检测字段是否为空的方法_PHP教程
  9. 浅析RTB和RTA(二)
  10. Java并发编程 基础知识学习总结
  11. python核心编程-第六章-个人笔记(二)
  12. 使用ENVI5.3构建时序数据展示
  13. 永远不要低估自己,love your fear.
  14. spring 项目启动完成执行_凝聚合力形成攻坚之势——21天顺利完成启动炉烟道改造施工项目...
  15. Python queue
  16. Arrays.aslist新建的list集合不能add()、remove()你知道吗?
  17. RPN 模型简要介绍
  18. 二分查找算法(非递归)
  19. 网站域名注册信息怎么查询?
  20. Oracle忘了保存,Oracle Cloud甲骨文云服务器忘记SSH秘钥或未设置Public key的解决办法...

热门文章

  1. $compile 手动编译
  2. 基于用户击键特征的身份鉴别系统
  3. SQL PROMPT5.3.4.1的一些设置选项
  4. 85. Maximal Rectangle
  5. android中怎么保存checkbox中的checked属性_第二十四天HTML中的form表单
  6. 空间留言软件_电脑硬盘空间提示不足,原来还可以这么做,真是学到老活到老...
  7. vue——走马灯-类轮播图
  8. 940B. Our Tanya is Crying Out Loud
  9. c js php比较字符串,Php 比较字符串相像度
  10. RT-Thread I2C设备驱动框架的对接使用