深入理解计算机系统(3.1)------汇编语言和机器语言

  《深入理解计算机系统》第三章——程序的机器级表示。作者首先讲解了汇编代码和机器代码的关系,阐述了汇编承上启下的作用;接着从机器语言IA32着手,分别讲述了如何存储数据、如何访问数据、如何完成运算以及如何进行跳转。通过这些步骤,又告诉了我们分支语句、循环语句是怎么完成的,函数调用、栈帧结构以及递归过程。最后能通过编译器产生的汇编代码表示,我们要了解编译器和它的优化能力,知道编译器能为我们完成哪些工作。

  而这篇博客我们将讲解汇编和机器代码的关系。首先下面一张图是C语言、汇编语言以及翻译过的机器语言,大家可以先有个大概的眼熟。

上图引用至:http://www.jianshu.com/p/c60a9c2131c3

1、机器语言

  这系列博客第一篇 Hello World是如何运行的  我们就详细讲解了程序的编译,一个C语言程序是经过编译器变成汇编程序,然后通过汇编器变成机器代码,最后被计算机执行。

  计算机是不能直接识别我们所编写的C程序或者Java程序的。它只能识别机器语言,而机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指指令系统令的集合。

  早期计算机就是指可以执行机器指令,进行运算的机器。在我们常用的PC机中,有一个芯片,就是我们常说的CPU(Central Processing Unit,中央处理单元)可以完成前面所说的计算机的功能,但是每一种这样的微处理器(CPU)由于硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言。

  早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。

  用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作。编写程序花费的时间往往是实际运行时间的几十倍或几百倍,而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。

  那么该怎么办呢?这时候汇编语言便产生了。

  需要注意的是现在除了计算机生产厂家的专业人员外,一般是不需要学习机器语言了。

2、汇编语言

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

  比如下面将寄存器 BX 的内容发送到 AX 上:

操作:寄存器BX的内容送到AX中
 
1000100111011000              机器指令
 
mov ax,bx                    汇编指令

  我们能很明显的从上面两条指令看出区别,汇编指令相对于机器指令是很容易记住的。

  可能有人会问,我们用汇编语言编写程序,可是计算机只认识机器指令,那该怎么办?这时候就需要一个能将汇编语言转换成机器指令的工具,我们称其为编译器。程序员用汇编语言写出源代码,再用汇编编译器将其编译为机器码,最后由计算机执行。

  汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。

   汇编语言的另一个特点就是它所操作的对象不是具体的数据,而是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道,这也是为什么汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂,因为既然数据是存放在寄存器或存储器中,那么必然就存在着寻址方式,也就是用什么方法找到所需要的数据。例如上面的例子,我们就不能像高级语言一样直接使用数据,而是先要从相应的寄存器AX、BX 中把数据取出。这也就增加了编程的复杂性,因为在高级语言中寻址这部分工作是由编译系统来完成的,而在汇编语言中是由程序员自己来完成的,这无异增加了编程的复杂程度和程序的可读性。

   再者,汇编语言指令是机器指令的一种符号表示,而不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程序与机器有着密切的关系。所以,除了同系列、不同型号CPU 之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程序是无法移植的,也就是说,汇编语言程序的通用性和可移植性要比高级语言程序低。

  总结起来就是三个特点:机器相关性、高速度和高效率、编写和调试复杂(相对于高级语言)。

3、高级语言

   前面的机器语言和汇编语言我们都有一定了了解了,汇编语言也是和机器语言一样,都是直接对硬件进行操作,但是汇编语言指令采用了英文缩写的标识符,更容易识别和记忆。但是说起来更容易识别和记忆,也只是相对于机器语言而言的。在实际编程中,汇编语言源程序也是十分复杂和冗长的,这时候高级语言产生了。

  高级语言并不是指一种语言,而是包括很多编程语言,比如Java、C、C++、C#、python等等,是高度封装的编程语言。高级语言与计算机的硬件结构和指令系统无关,它有更强的表达能力,可方便地表示数据的运算和程序的控制结构,能更好的描述各种算法,而且容易学习掌握。但高级语言编译生成的程序代码一般比用汇编程序语言设计的程序代码要长,执行的速度也慢。

  从最开始我们给出的一张图也可以看出,C语言写出的短短几行代码,翻译成汇编语言会多很多,更不用说变成机器语言了。

4、总结

  首先我要说明的是,我们不需要学会如何用机器语言,汇编语言来进行编程,毕竟我们不是计算机生产厂家的专业人员。我们所要知道的是如何看懂汇编语言就行了。因为在我们所编写的高级语言,被翻译成汇编语言时,编译器会自动进行一些优化处理,而这些处理如果我们不知道,就会造成程序上的错误,具体实例后面会详细讲到。

  下一篇博客我们将讲解一个简单的汇编程序实例。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

R语言学习笔记之——数据处理神器data.table

数据处理在数据分析流程中的地位相信大家都有目共睹,也是每一个数据从业者面临的最为繁重的工作任务。 在实际应用场景下,虽然SQL(SQL类专业的etl语言)是数...

2958
来自专栏about云

区块链概念1:Hash 算法

问题导读 1.哈希算法在区块链的作用是什么? 2.什么是哈希算法? 3.哈希算法是否可逆? 4.比特币采用的是什么哈希算法? 作用 在学习哈希算法前,我们需...

4196
来自专栏WindCoder

Python学习四周小结-测试题篇

自从发现网易云课堂的计算机课程系列中有Python后就报名听了下,作为新人很快被其模式所吸引了,同时发现自己之前自学时的不足,那时由于没有作业等,自己只是根据《...

752
来自专栏Jed的技术阶梯

Java设计模式之抽象工厂模式

好了,我们继续上一节课(Java设计模式之工厂方法模式),上一节讲到女娲造人,人是造出来了,世界时热闹了,可是低头一看,都是清一色的类型,缺少关爱、仇恨、喜怒哀...

774
来自专栏CDA数据分析师

Excel简化办公系列之一 | VLOOKUP代替IF函数

本文为CDA作者青菜原创文章,转载请注明来源 编者按:CDA作者青菜将在近期发布「Excel简化办公」系列文章,本文是第一篇;更多精彩请持续关注~ 在日常工作...

2089
来自专栏CSDN技术头条

关系型数据库是如何运作的(上)

一说到关系型数据库,我总感觉缺了点什么。如果你尝试透过“关系型数据库是如何运作的”的关键词句来进行搜索,其搜索结果是少量的而且内容是简短的。难道说是由于它已经太...

1908
来自专栏数据派THU

独家 | 带你入门比Python更高效的Numpy(附代码)

向量化技巧对于数据科学家来说是相当熟知的,并且常用于编程中,以加速整体数据转换,其中简单的数学变化通过可迭代对象(例如列表)执行。未受到重视的是,把有一定规模的...

823
来自专栏程序员互动联盟

【基础编程】侃侃数据结构与算法-扯扯概念

? 为啥扯淡,因为我们开发人员很少用到它,目前流行的android开发有数据结构么?没有,至少你在用api的时候基本上是看不见的。c++有在STL基本容器中s...

35813
来自专栏PPV课数据科学社区

"数学之美"系列五——简单之美:布尔代数和搜索引擎的索引

建立一个搜索引擎大致需要做这样几件事:自动下载尽可能多的网页;建立快速有效的索引;根据相关性对网页进行公平准确的排序。我们在介绍 Google Page Ran...

2513
来自专栏包子铺里聊IT

系统设计系列之自动完成的秘密

文本框自动完成是一项十分常见的功能。从表单的自动填充到搜索引擎的智能提示,这个功能极大地提高了用户的输入效率,也有效地防止了手误的可能。 ? 但是,积极进取的...

2666

扫码关注云+社区