机器语言(machine language)是一种指令集的体系。这种指令集,称机器码(machine code),是电脑的CPU可直接解读的数据。
机器码有时也被称为原生码(Native Code),这个名词比较强调某种程式语言或库,它与运行平台相关的部份。
基本介绍
- 中文名:机器语言
- 外文名:machine language
- 特点:计算机直接识别的二进制代码
- 优点:直接执行,速度快,资源占用少
- 缺点:可读性、可移植性差,编程繁杂
- 类别:计算机学术语
相关简介
机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。它是计算机的设计者通过计算机的硬体结构赋予计算机的操作功能。机器语言具有灵活、直接执行和速度快等特点。不同型号的计算机其机器语言是不相通的,按着一种计算机的机器指令编制的程式,不能在另一种计算机上执行。
指令系统

一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如,操作码栏位和地址码栏位,其中操作码指明了指令的操作性质及功能,地址码则给出了运算元或运算元的地址。
用机器语言编写程式,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程式时,程式设计师得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作。编写程式花费的时间往往是实际运行时间的几十倍或几百倍。而且,编出的程式全是些0和1的指令代码,直观性差,还容易出错。除了计算机生产厂家的专业人员外,绝大多数的程式设计师已经不再去学习机器语言了。
- 机器语言是微处理器理解和使用的,用于控制它的操作二进制代码。
- 8086到Pentium的机器语言指令长度可以从1位元组到13位元组。
- 儘管机器语言好像是很複杂的,然而它是有规律的。
- 存在着多至100000种机器语言的指令。这意味着不能把这些种类全部列出来。
以下是一些示例:
- 指令部份的示例
- 0000 代表 载入(LOAD)
- 0001 代表 存储(STORE)
...
- 暂存器部份的示例
- 0000 代表暂存器 A
- 0001 代表暂存器 B
...
- 存储器部份的示例
- 000000000000 代表地址为 0 的存储器
- 000000000001 代表地址为 1 的存储器
- 000000010000 代表地址为 16 的存储器
- 100000000000 代表地址为 2^11 的存储器
- 集成示例
- 0000,0000,000000010000 代表 LOAD A, 16
- 0000,0001,000000000001 代表 LOAD B, 1
- 0001,0001,000000010000 代表 STORE B, 16
- 0001,0001,000000000001 代表 STORE B, 1
指令格式
计算机的指令格式与机器的字长、存储器的容量及指令的功能都有很大的关係。从便于程式设计、增加基本操作并行性、提高指令功能的角度来看,指令中应包含多种信息。但在有些指令中,由于部分信息可能无用,这将浪费指令所占的存储空间,并增加了访存次数,也许反而会影响速度。因此,如何合理、科学地设计指令格式,使指令既能给出足够的信息,又使其长度儘可能地与机器的字长相匹配,以节省存储空间,缩短取值时间,提高机器的性能,这是指令格式设计中的一个重要问题。
计算机是通过执行指令来处理各种数据的。为了指出数据的来源、操作结果的去向及所执行的操作,一条指令必须包含下列信息:
(1)操作码。它具体说明了操作的性质及功能。一台计算机可能有几十条至几百条指令,每一条指令都有一个相应的操作码,计算机通过识别该操作码来完成不同的操作。
(2)运算元的地址。CPU通过该地址就可以取得所需的运算元。
(3)操作结果的存储地址。把对运算元的处理所产生的结果保存在该地址中,以便再次使用。
(4)下条指令的地址。执行程式时,大多数指令按顺序依次从主存中取出执行,只有在遇到转移指令时,程式的执行顺序才会改变。为了压缩指令的长度,可以用一个程式计数器(ProgramCounter,PC)存放指令地址。每执行一条指令,PC的指令地址就自动+1(设该指令只占一个主存单元),指出将要执行的下一条指令的地址。当遇到执行转移指令时,则用转移地址修改PC的内容。由于使用了PC,指令中就不必明显地给出下一条将要执行指令的地址。
一条指令实际上包括两种信息即操作码和地址码。操作码(OperationCode,OP)用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数。地址码用来描述该指令的操作对象,它或者直接给出运算元,或者指出运算元的存储器地址或暂存器地址(即暂存器名)。
指令系统

指令包括操作码域和地址域两部分。根据地址域所涉及的地址数量,常见的指令格式有以下几种。
①三地址指令:一般地址域中A1、A2分别确定第一、第二运算元地址,A3确定结果地址。下一条指令的地址通常由程式计数器按顺序给出。
②二地址指令:地址域中A1确定第一运算元地址,A2同时确定第二运算元地址和结果地址。
③单地址指令:地址域中A 确定第一运算元地址。固定使用某个暂存器存放第二运算元和操作结果。因而在指令中隐含了它们的地址。
④零地址指令:在堆叠型计算机中,运算元一般存放在下推堆叠顶的两个单元中,结果又放入栈顶,地址均被隐含,因而大多数指令只有操作码而没有地址域。
⑤可变地址数指令:地址域所涉及的地址的数量随操作定义而改变。如有的计算机的指令中的地址数可少至 0个,多至6个。
机器语言的套用
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。各计算机公司设计生产的计算机,其指令的数量与功能、指令格式、定址方式、数据格式是差别的。从计算机的发展过程可以看到,由于构成计算机的基本硬体发展迅速,计算机的更新换代很快,这就存在软体如何跟上硬体的问题。一台新机器推出交付使用时,只有少量系统软体(如作业系统等)可提交用户,大量软体是不断充实的,尤其是应用程式,有相当一部分是用户在使用机器时不断产生的。为了缓解新机器的推出致使原有应用程式不能继续使用的问题,各个计算机公司生产的同一系列的计算机时,儘管其硬体实现方法可以不同,但指令系统、数据格式、I/O系统等保持相同,因而软体完全兼容。当研製该系列计算机的新型号时,儘管指令系统可以有较大的扩充,但仍保留了原来的全部指令,使软体向上兼容,即旧机型上的软体不加修改即可在新机器上运行。
说到这里大家明白为什幺电脑即计算机,计算机即电脑了吧,原来无论它表现得多幺地智慧型,其实质也不过是这些二进制代码运算的结果。但是二进制代码使用起来太费劲了,于是后来就在其基础上发展出的彙编语言,但是彙编依然看起来不直观,于是最终就出现了现代编程所採用的高级语言。这是计算机程式语言的发展。有了程式语言,按说就可以使这些机器为我所用了。实际还没那幺简单。首先每做一件事,都要重複编一大堆的操作程式,工作量很大。其次,现在咱们都看到了,使用计算机的人,大多数,都不是计算机专业的,甭说编程了,操作步骤複杂一点都要抵制。所以,还需要一个作业系统,将複杂的操作留给自己,把简单的操作,呈现给用户。
主要缺点
总况
1.大量繁杂琐碎的细节牵制着程式设计师,使他们不可能有更多的时间和精力去从事创造性的劳动,执行对他们来说更为重要的任务。如确保程式的正确性、高效性。
指令系统

2.程式设计师既要驾驭程式设计的全局又要深入每一个局部直到实现的细节,即使智力超群的程式设计师也常常会顾此失彼,屡出差错,因而所编出的程式可靠性差,且开发周期长。
3.由于用机器语言进行程式设计的思维和表达方式与人们的习惯大相逕庭,只有经过较长时间职业训练的程式设计师才能胜任,使得程式设计曲高和寡。
4.因为它的书面形式全是"密"码,所以可读性差,不便于交流与合作。
5.因为它严重地依赖于具体的计算机,所以可移植性差,重用性差。
这些弊端造成当时的计算机套用未能迅速得到推广。
弱通用性
各计算机公司设计生产的计算机,其指令的数量与功能、指令格式、定址方式、数据格式都有差别,即使是一些常用的基本指令,如算术逻辑运算指令、转移指令等也是各不相同的。因此,儘管各种型号计算机的高级语言基本相同,但将高级语言程式编译成机器语言后,其差别也是很大的。因此将用机器语言表示的程式移植到其他机器上去几乎是不可能的。从计算机的发展过程已经看到,由于构成计算机的基本硬体发展迅速,计算机的更新换代是很快的,这就存在软体如何跟上的问题。大家知道,一台新机器推出交付使用时,仅有少量系统软体(如作业系统等)可提交用户,大量软体是不断充实的,尤其是应用程式,有相当一部分是用户在使用机器时不断产生的,这就是所谓第三方提供的软体。
为了缓解新机器的推出与原有应用程式的继续使用之间的矛盾,1964年在设计IBM360计算机时所採用的系列机思想较好地解决了这一问题。从此以后,每个计算机公司生产的同一系列的计算机儘管其硬体实现方法可以不同,但指令系统、数据格式、I/O系统等保持相同,因而软体完全兼容(在此基础上,产生了兼容机)。当研製该系列计算机的新型号或高档产品时,儘管指令系统可以有较大的扩充,但仍保留了原来的全部指令,保持软体向上兼容的特点,即低档机或旧机型上的软体不加修改即可在比它高档的新机器上运行,以保护用户在软体上的投资。