这个问题问的很有深度,你很善于思考。
这里的机器笼统的说就是硬件,我们知道硬件本身也是有程序的,只不过程序固化在硬件上,这些程序不同于我们通常所说的软件中的程序,他们不能被修改,只有该硬件的设计者才清楚这些程序的具体规范和流程。
可是我们也知道,计算机是一个复杂的体系,不是一个硬件就可以解决的,它需要多个硬件协调工作,问题来了,这些硬件是由不同的设计者或公司完成的,它们的程序只有设计者才清楚,那么他们如何协调工作呢?即某个设计者设计的硬件如何调用其他设计者设计的其他硬件,以便协同完成工作呢?同一种硬件可能有很多不同的设计者,设计了不同的固化程序,其他类型的硬件要调用此种硬件不可能一一了解所有这类硬件的设计细节,而且即便能清楚市面上存在的所有这类硬件的细节,也难保以后再出现其他的设计,那么这个问题该如何解决呢?
解决思路实际上很简单,我们只需要定义一个标准的输入输出规范,设计者在硬件中固化的程序如果不满足这个规范,只需要在硬件的外围加一层软件程序来满足这样的规范,这样一来其他硬件并不需要知道这个硬件的内部细节,只需要调用硬件外围的软件程序即可,软件程序再调用硬件内部的程序,该软件程序必须要有清楚硬件内部程序的人来设计,一般来说,硬件的发布者会附带发布一个这样的程序来满足业界的规范,这个程序就是我们通常意思上所说的“驱动程序”。
有了这样的机制,即使两个硬件的设计者设计了不同的固化程序,只要他们采用相同的规范,提供相同的外围访问接口,就可以被认为是相同的硬件。
不幸的是规范实际上是把双刃剑,它的出现统一了业界繁杂的各种体系,也同时阻碍了体系结构的发展,这个问题我就不再详述了。
了解了上面的问题之后,我们再来谈谈你所说的这个汇编语言。
汇编语言是面向机器的,这句话过于笼统,或者说不够准确。实际上任何语言都可以针对机器或者某个特定平台开发。只不过汇编语言由于其本身贴近机器语言,所以任何硬件不需要提供专门的软件接口,就可以由汇编语言直接访问该硬件的固化程序,而如果该硬件提供了基于其他语言的编程接口,且提供了该硬件的所有内部特性,那么我们认为使用这种语言也可以访问该硬件。我们知道,很多语言开发的程序,其实也是要编译成机器语言的,理论上说,这样的程序也可以直接用汇编来开发。
上面我们说了,汇编语言同其他语言其实很相似,他们最终也都是要编译为机器语言,汇编语言能够做到的,理论上其他语言也能够做到,其他语言能够做到的,理论上汇编语言也能够做到。
但是现实是,汇编语言能做到的,其他语言不一定能做到,而其他语言能做到的,汇编语言也不一定能做到。这实际上是由于行业布局问题导致的,换句话说,是人为的将它们区别开来了。
由于硬件的发布者没有开发基于其他高级语言的开发接口,导致开发人员只能使用汇编开发这类硬件,而其他高级语言则做不到。主要考量是由于这类底层开发的频度较低,且单个硬件的功能较少,没必要提供高级开发接口,开发人员完全可以通过汇编封装一个应用供高级程序调用,所以也就没有这类行业需求。
由于平台的发布者没有提供基于汇编开发的相关资料,导致开发人员在基于该平台开发程序时,只能使用对应的高级语言,而汇编语言则做不到。这其中的主要考量是,平台往往为某类应用提供开发环境,且需要严格遵循底层规范,大部分开发人员很难在庞大的应用中控制好各种底层规范,所以大部分人并不会考虑使用汇编开发这类繁杂的应用,对于发布者来说,提供基于汇编开发的完整资料也就失去了商业价值,也就导致了这样的局面。其实,我就有用汇编写过Windows程序的,只做了一个简单的类似Windows笔记本的应用,再往下写就很复杂了。
对于你所提到的问题做个简单的总结:
不同的机器是否对应不同的汇编语言?理解错误。汇编语言是包含了该语言的基本规范,它们是实际上是通用的,应该说基于不同的机器需要面向不同的调用,或者面向不同的功能,语言只不过是使用这些功能的工具。
这里的“机器”指什么?机器指的就是硬件,实际上指的是该应用中的独特程序,它可以是固化在硬件上的程序,也可以是随硬件提供的外围驱动程序。
这台能用,其他的可否使用?如果两台电脑使用了同样的硬件,当然可以。如果两台电脑的硬件并不完全相同,只要它们遵循了同样的规范,也可以。而如果两台电脑中的硬件规范不一,如果他们提供了遵循同样规范的驱动程序,且你的程序是基于该驱动程序编写的,那么也是可以的。实际上当前市面上大部分的硬件都遵循中同样的体系规范,并不会有那么大的差别。
“机器”是指电脑,但不同体系的电脑代码体系是不同的,就是CPU指令不同。比如Intel体系集团(将这一类合称一个集团)的CISC(复杂指令集计算机),就与早期的DJS-130机CPU指令码就不同。intel 8088是8位长度数据,这是数据进了IP指令寄存器(Instruction Pointer)就成了指令,进了AH、AL--DH、DL就成了数据。DJS-130是16位的,0000 就是JMP,这个代码与8088的JMP(0E)不同(代码记不清了,0E不一定正确),这就是面向机器的意思。同样的JMP,在不同体第的电脑中,编译后的值及数据宽度不同。
当然不是这台电脑和另外一台的区别 而是各种不同平台之间的通用性。比如unix 和 windows等平台之间
汇编语言与硬件打交道,当然首先要有对应得cpu支持了,其他的就没有别的了。cpu架构一样,这个语言就能在上面编译