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

也许有的同学喜欢用汇编语言来实现操作系统,觉得用汇编来写程序似乎更简单直接,可控性比较强,有种“一切尽在掌握”的赶脚。而用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语言的理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视觉SLAM十四讲(2):初识SLAM

这一讲主要介绍视觉SLAM的结构,并完成第一个SLAM程序:HelloSLAM。 目录 2.1 小萝卜的例子 单目相机 双目相机 深度相机 2.2 经典视觉SLAM框架 2.3 SLAM问题的数学表述 2.4 编程实践 Hello SLAM 使用cmake 使用库 【高翔】视觉SLAM十四讲2.1 小…

一步步编写操作系统 44 用c语言编写内核1

先来个简单的,欢迎我们神秘嘉宾——main.c。这是我们第一个c语言代码。 1 int main(void) { 2 while(1); 3 return 0; 4 }它没法再简单啦,简单的程序似乎能帮助咱们更容易的理解所学的知识,哈哈,我说的是似乎,其实&…

从零实现一个3D目标检测算法(1):3D目标检测概述

本文是根据github上的开源项目:https://github.com/open-mmlab/OpenPCDet整理而来,在此表示感谢,强烈推荐大家去关注。使用的预训练模型也为此项目中提供的模型,不过此项目已更新为v0.2版,与本文中代码略有不同。 本文…

一步步编写操作系统 45 用c语言编写内核2

在linux下用于链接的程序是ld,链接有一个好处,可以指定最终生成的可执行文件的起始虚拟地址。它是用-Ttext参数来指定的,所以咱们可以执行以下命令完成链接: ld kernel/main.o -Ttext 0xc0001500 -e main -o kernel/kernel.bin …

使用OpenCV库快速求解相机内参

本文主要介绍如何使用OpenCV库函数求解相机内参。具体可查阅官网:https://docs.opencv.org/master/dc/dbb/tutorial_py_calibration.html。 关于相机内参的求解还有很多其它的工具,如使用MATLAB求解会更方便,直接调用MATLAB中的APP即可。 1.背…

一步步编写操作系统 46 用c语言编写内核3

再把上节代码贴出来, 1 //int main(void) { 2 int _start(void) { 3 while(1); 4 return 0; 5 }有没有同学想过,这里写一个_start函数,让其调用main函数如何?其实这是可以的,main函数并不是第一个函数,它实…

一步步编写操作系统 47 48 二进制程序运行方式

操作系统并不是在功能上给予用户的支持,这种支持是体现在机制上。也就是说,单纯的操作系统,用户拿它什么都做不了,用户需要的是某种功能。而操作系统仅仅是个提供支持的平台。 虽然我们是模仿linux来写一个黑屏白字的系统&#x…

百度顶会论文复现(1):课程概述

最近百度推出了一款重磅课程《全球顶会论文作者,28天免费手把手带你复现顶会论文》。这个课程真的是很硬核的课程,这里简单记录下自己的学习过程。 文章目录1. 课程设计思路和安排2. 课程大纲1. 课程设计思路和安排 课程设计思路如下,共分为…

百度顶会论文复现(2):GAN综述

本节课主要是对GAN的发展进行了介绍,包括基本原理,训练方法,存在问题,改进以及应用场景等。实践作业则为手写数字生成。课程地址为:https://aistudio.baidu.com/aistudio/education/preview/493290。 文章目录1.什么是…

一步步编写操作系统 48 二进制程序的加载方式

接上节,程序头可以自定义,只要我们按照自己定义的格式去解析就行。也许我光这么一说,很多同学还是不能彻底明白如何自定义文件头,因为大多数同学都是用高级语言来写程序,即使用了偏底层的c语言,不同平台的c…

百度顶会论文复现(3):视频分类综述

本节课主要是对视频分类的发展进行了介绍,包括任务与背景,分类方法,前沿进展等。课程地址为:https://aistudio.baidu.com/aistudio/course/introduce/1340?directly1&shared1。 文章目录1. 任务与背景2. 视频分类方法2.1 双流…

一步步编写操作系统 46 linux的elf可执行文件格式1

ELF文件格式依然是分为文件头和文件体两部分,只是该文件头相对稍显复杂,类似层次化结构,先用个ELF header从“全局上”给出程序文件的组织结构,概要出程序中其它头表的位置大小等信息,如程序头表的大小及位置、节头表的…

百度顶会论文复现(4):飞桨API详解

本节课主要是对飞桨常用API进行了介绍,课程地址为:https://aistudio.baidu.com/aistudio/education/group/info/1340。 文章目录1.飞桨API官网2. API使用介绍3. 飞桨模型操作1.飞桨API官网 官网地址为:https://www.paddlepaddle.org.cn/docu…

一步步编写操作系统 47 elf格式文件分析实验

在上一节中,我们讲述了elf格式的部分理论知识,为什么是部分呢?因为我们本着“够用”的原则,只把我们需要了解的部分说完啦。不过,我相信大部分同学仅仅凭上一节中的理论知识还是领悟不到elf本质,咱们在本节…

百度飞桨顶会论文复现(5):视频分类论文之《Representation Flow for Action Recognition》篇

这次老师在课上总共领读了4篇分类论文,我这里分享其中的一篇论文,是关于使用神经网络对光流进行学习。 课程地址是:https://aistudio.baidu.com/aistudio/education/group/info/1340。 论文地址是:https://arxiv.org/abs/1810.014…

智能算法(GA、DBO等)求解零等待流水车间调度问题(NWFSP)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年…

一步步编写操作系统 50 加载内核3

接上节,在这里,我们把参数放到了栈中保存,大家注意到了,参数入栈的顺序是先从最右边的开始,最后压入的参数最左边的,其实这是某种约定,要不,为什么不先把中间的参数src入栈呢。既然主…

动手学无人驾驶(5):多传感器数据融合

本系列的前4篇文章主要介绍了深度学习技术在无人驾驶环境感知中的应用,包括交通标志识别,图像与点云3D目标检测。关于环境感知部分的介绍本系列暂且告一段落,后续如有需要再进行补充。 现在我们开启新的篇章,在本文中将会介绍无人…

详解两阶段3D目标检测网络PVRCNN:Point-Voxel Feature Set Abstraction for 3D Object Detection

在《动手学无人驾驶(4):基于激光雷达点云数据3D目标检测》一文中介绍了3D目标检测网络PointRCNN。今天介绍该作者新提出的3D检测模型:PVRCNN,论文已收录于CVPR2020。 作者个人主页为:https://sshaoshuai.gi…

一步步编写操作系统 53 任务状态段TSS介绍

操作系统是利用PCB来维护所有任务的,包括进程和线程,但cpu提供的是TSS,linux系统可没用它,因为效率太低。但是还是要了解下TSS才清楚操作系统中某些操作的原因。 本节中所讲的特权级与它有着密不可分的联系,TSS作用不…