计算机语言

计算机语言有机器语言、汇编语言和高级语言。我们常说的有面向机器的机器语言、汇编语言;面向过程的C语言;面向对象的C++、JAVA等语言。但是计算机是“没有智慧的”,计算机真的能够理解机器语言吗?

机器语言

机器指令(一台计算机可以正确执行的命令):一列二进制数字。

  计算机将一列二进制数字转换成一列高低电平,以使计算机的电子器件受到驱动,进行计算。
  高低电平驱动计算机的电子器件,从而进行工作,进行计算,这是靠计算机底层的硬件设计、内部结构等(总之是硬件)来实现的,这句话很容易理解。那么由于硬件设计和内部结构的不同,就需要不同的电平脉冲来进行控制使他工作,在我们看来,也就是需要一列列不同的二进制数字来进行控制,而这一列二进制数字,我们称之为机器指令。那么每一种微处理器由于硬件设计和内部结构不同,也就各自有自己的机器指令集,也就是机器语言

总结:机器语言是机器指令的集合。

计算机真的能够理解“机器语言”吗?

对比一下这两句话:

  • 高低电平驱动计算机电子器件工作
  • 计算机识别和执行机器指令

  其中的高低电平机器指令(二进制数字)相对应。第一句,从真实的物质上而言,高低电平是物理状态,是能量的表现,其驱动电子器件工作,很容易理解;第二句,从感知上而言,我们认为计算机识别并执行机器指令(二进制的机器码)。而机器指令是二进制数字,是语言,是抽象的,计算机是无法理解语言的。计算机能够理解的只有高低电平(电信号),而无法真正理解机器语言(一列二进制数字)。看到上面说到“计算机可以将一列二进制数字转换成一列高低电平”,而我们所说的二进制数字是抽象的,计算机又是如何把抽象的数字转换成物理上的高低电平的呢?这句话到底该怎么理解?

机器指令是如何转变为高低电平的?

编译器是怎样把语言变成高低控制电平的? 机器语言的1010这一堆数字是怎么变成高低电平的? 关于这个问题,感觉很多人的回答还是比较敷衍的,下面是我个人的理解,我尝试去回答这个问题,可能会比较啰嗦。

  这就是一个观察角度的问题,机器接收到的就不是二进制数字1010(机器语言),而是高低电平脉冲(电信号)。
  机器指令(0101001···)是在我们的大脑中的。数码10在计算机中是以高低电平来存储的,计算机只能接收、处理高低电平(电信号),计算机所要处理的信息必须先转换为电信号,才能处理,我们就是按照高低电平直接把我们的10输入给计算机的,计算机只能处理电信号,它接收到的是我们输入的电平脉冲。在计算机看来,就只有高低电平;而在我们看来,他们就是10(在数字电路中只有高低电平,表示两种不同的逻辑状态高电平表示逻辑1低电平表示逻辑0)。
  计算机需要命令(一列高低电平脉冲)才能工作,而站在我们的角度(我们规定“高电平”用1表示,“低电平”用0表示),那就是,我们要给计算机一列二进制数字(所谓的机器指令)才能让计算机工作。实际上,我们已经把10转变成了高低电平输入到计算机。
  例如首台计算机(ENIAC)的编程是通过接插件进行的。计算机需要高低电平脉冲信号才能工作,为了方便描述,我们把一列高低电平记成一列二进制数字(机器指令),是我们把机器指令(0101001···)直接通过接插件的方式转变为高低电平输入给计算机的。后来到了打孔机的时代,我们的机器指令(1010代码),是专职的程序录入员将01用打孔和不打孔的方法,转换为纸条上的一串孔洞,然后有孔的程序纸带通过光照区,有孔、无孔就转换为光点和暗点,再通过光敏元件,就转变为高低电平了,以后机器中就只有高低电平了,而在我们看来,那就是我们的数据,就是我们的程序,那些高低电平就是10(二进制数字)啊。现在,计算机在存储器中存储的也都是电信号(高低电平),而我们认为那就是1010011···(数据和程序在计算机中都是以二进制的形式进行存储的),因为有序的高低电平的组合就有了意义,这时他可能是数据,可能是目标程序。
  假设我们用汇编语言来编程,当你敲击键盘的时候,按键的接通和断开,这时键盘底层的电路(比如编码电路),已经将你的这次按键过程按照某种编码方式(比如ASCII码)转变成了一列高低电平信号,由于统一的标准,计算机就可以理解这一脉冲信号,从而产生动作。计算机可以在存储器上存储这一电信号,在我们看来,计算机就存储了按键的编码数据,所以一个完整的程序就是按照某种编码方式所存储的高低电平信号的有序组合,而这个有序是按照我们规定的编码方式以高低电平来进行存储,但对计算机而言,并不是有序的高低电平的组合,依然是无法执行的,所以计算机不能直接识别和执行汇编语言源程序。因此,需要将汇编语言源程序经过一种语言处理程序加以处理,得到机器指令形式的目标程序,计算机才能识别和执行。这一过程实质上就是,将对我们来说有序的0101001···高低电平(按照我们规定的编码方式所存储的程序)简化、处理,从而转变成了对计算机来说是有序的高低电平组合、能够驱动电子器件工作而完成一个个具体任务的高低电平电信号(在我们的角度看来,这最终驱动计算机工作的高低电平0101001···就是机器语言了,这时我们认为他是另一种有序的0101001···,即机器指令)。

汇编语言

  汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。

1147566-20171024221820441-1059676946.png图 1 用汇编语言编写程序的工作过程

这一过程的实质其实就是将一种高低电平的有序组合转变成另一种能够驱动计算机工作的高低电平的有序组合

汇编语言的组成

汇编语言发展至今,有以下三类指令组成:

  • 汇编指令:机器码的助记符,有对应的机器码
  • 伪指令:没有对应的机器码,由编译器执行,计算机并不执行
  • 其他符号:如 +、-、*、/ 等,由编译器识别,没有对应的机器码

汇编语言的核心是汇编指令,他决定了汇编语言的特性。

高级语言

  高级语言克服了机器语言和汇编语言依赖于具体计算机的缺陷,使计算机语言成为描述各种问题求解过程的算法语言。并从过程化语言发展为现代广泛应用的面向对象的语言。用某种高级语言编写的程序称为高级语言源程序,如 C++ 语言源程序等。

高级语言不涉及机器的硬件结构

在 C 语言编程中,C “不能”直接操作寄存器,只能操作内存;
汇编语言,不仅能够操作寄存器,也可以操作内存。

  在现代程序设计中,采用在高级语言中提供与汇编语言之间的调用接口的方法,很好地利用了高级语言和汇编语言各自的优点,摒弃了两者的不足。用汇编语言编写的程序作为高级语言的一个外部过程或函数,汇编源程序和高级语言源程序分别通过汇编、编译成目标文件后,利用连接程序把他们连接成可执行文件即可执行。

//C语言中嵌入汇编
//编译环境:VS2015
#include <stdio.h>
int main(void)
{
    int a;
    printf("%p\n", &a);
    a = 10; //变量赋值,都是CPU的寄存器完成
    printf("%d\n", a);
    
    _asm
    {
        mov eax, 15
        mov a, eax
    }
    printf("%d\n", a);
    
    _asm
    {
        mov eax, a
        add eax, 5
        mov a, eax
    }
    printf("%d\n", a);
    
    return 0;
}

程序运行结果如下所示:
1147566-20171025013855832-1896793874.png

参考资料:

  • 《微机与单片机原理》(第 4 版).孙旭飞主编 .第 1 章:计算机系统概论
  • 《汇编语言》(第 2 版).王爽著 .第 1 章:1.1-1.7 节 | 1.8-1.10 节 | 1.11-1.15 节
  • 广义的计算机语言即把计算机上安装的所有不同层面上的软件都看成是计算机语言。(参考:计算机系统的层次结构
  • 我们利用计算机解决问题,使其展开复杂的任务处理,实际上就是在计算机系统的层次结构上按照从较高层次到较低层次的层层“翻译”来完成的,如常见的:用户→建模→应用程序→高级语言→汇编、编译或解释语言→操作系统→机器语言→微程序→硬联逻辑。(参考:计算机系统的层次结构

转载于:https://www.cnblogs.com/bitrocco/p/7720734.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值