欢迎您光临五金加工厂,如有问题请及时联系我们。

汇编语言语句和机器指令是一一对应的吗?汇编语言和机器有关吗

作者:五金加工
文章来源:本站

  

汇编语言语句和机器指令是一一对应的吗?汇编语言和机器有关吗

  

汇编语言语句和机器指令是一一对应的吗?汇编语言和机器有关吗

  应该是汇编指令与机器指令一一对应的,而不是汇编语句。其实,汇编指令就是机器指令用符号来表示的。每一个汇编指令就是一个机器指令码。

  操作系统我是没写过的,但是我用C语言和汇编语言给C51、AVR、STM32等写了很多的程序, 谈点自己的看法。

  使用何种语言写操作系统,很大一部分原因是受到目标平台硬件的影响,或者更准确地说,是CPU的影响,可以谨慎地讲,语言的本质是指令集,而指令集是物理电路的抽象。因此,一个特定的CPU肯定对应了一套特定的指令集,当然考虑到兼容性等因素,也有很多不同类型的CPU支持同样的指令集,例如Intel和AMD的x86-64,ARM中用到的Thumb-2等,我们可以把这套指令集叫做机器语言,就是一些个0和1的组合,如果不考虑开发难易程度和效率,最适合写操作系统的应该是机器语言。

  在有了机器语言之后,因为太复杂而又晦涩难懂,就出现了汇编语言,汇编语言相当于是把指令集给起了一个名字,通过特定的编译器,可以把汇编语言转化为对应的机器语言,也就是CPU能够识别并执行的指令集,因此,汇编语言也是可以用来写操作系统的。汇编语言其实和机器语言之间几乎可以画上等号了,所有指令(不包括伪指令)都与CPU的指令集对应(所以一般情况下,相对于开发其他高级语言的编译器,开发汇编语言的编译器是“比较简单”的工作)。

  后来,又出现了Fortran、Pascal、C等语言。而C语言应该是最接近汇编的语言,可能没有之一,学过汇编之后再去学习C,会发现很多C的数据类型和结构等,例如数组,指针等,都能够在汇编中找到对应的寻址方法,C语言中的下标从0开始,个人觉得这也是受到汇编的影响。另外,C语言比较容易书写,例如一个循环或者过程,你在汇编中要留意使用到了哪些寄存器、堆栈、甚至PSW等,要保护现场,之后还要恢复现场,保持堆栈平衡等等,稍不留神就会带来问题,然后就是坑爹的调试。但是用C语言一个for循环,或者一个函数,能省去汇编中很多枯燥麻烦而又容易出错的工作。如果有兴趣,可以试着反编译一下现代C编译器(例如gcc)产生的目标文件,会发现其生成的代码和手工写汇编的代码具有相当的指令条数和指令周期,在打开某些高级选项时,还能利用CPU较新的指令,例如条件传递(cmov)等,提升程序的执行效率,因此用C语言开发一个操作系统是很自然的事情。

  因此,写操作系统可以用机器语言,也可以用汇编和C。

  虽然说用汇编和C开发操作系统是顺其自然的事情,但是说只能用C语言和汇编开发操作系统肯定是不正确的,窃以为,所有能够生成对应硬件平台的CPU指令集的语言,都是可以用来开发操作系统的,但是还是会涉及到行业生态环境、兼容性、难易程度等多方面的问题,而且目前的几个操作系统,如UNIX,Windows、Linux等都是用C语言开发的,所以自然而然地这个就成了业界“潜规则”了,而且在抛开算法和数据结构的差异下,C语言的速度几乎是最快的了,在某种程度上,通过进行构造的语句和编译器优化,在某种程度上甚至和汇编已经不相上下,虽然C的语法容易带来quick & dirty的效果,但是对于精通C语言的人来说,这正是C的美妙之处。假设,我们现在有C#语言,其实这种支持.NET的语言会被编译为中间语言(IL),假如我们开发出一款能将中间语言作为其汇编语言,甚至是指令集的CPU的话,那么.NET程序的开发和执行会更加迅速。

来源:文章来源于网络,如有侵权请联系我们删除。本文由五金加工编辑,欢迎分享本文,转载请保留出处和链接!