《深刻理解计算机系统》第三章——程序的机器级表示。做者首先讲解了汇编代码和机器代码的关系,阐述了汇编承上启下的做用;接着从机器语言IA32着手,分别讲述了如何存储数据、如何访问数据、如何完成运算以及如何进行跳转。经过这些步骤,又告诉了咱们分支语句、循环语句是怎么完成的,函数调用、栈帧结构以及递归过程。最后能经过编译器产生的汇编代码表示,咱们要了解编译器和它的优化能力,知道编译器能为咱们完成哪些工做。html
而这篇博客咱们将讲解汇编和机器代码的关系。首先下面一张图是C语言、汇编语言以及翻译过的机器语言,你们能够先有个大概的眼熟。java
上图引用至:http://www.jianshu.com/p/c60a9c2131c3python
这系列博客第一篇 Hello World是如何运行的 咱们就详细讲解了程序的编译,一个C语言程序是通过编译器变成汇编程序,而后经过汇编器变成机器代码,最后被计算机执行。程序员
计算机是不能直接识别咱们所编写的C程序或者Java程序的。它只能识别机器语言,而机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指指令系统令的集合。算法
早期计算机就是指能够执行机器指令,进行运算的机器。在咱们经常使用的PC机中,有一个芯片,就是咱们常说的CPU(Central Processing Unit,中央处理单元)能够完成前面所说的计算机的功能,可是每一种这样的微处理器(CPU)因为硬件设计和内部结构的不一样,就须要用不一样的电平脉冲来控制,使它工做。因此每一种微处理器都有本身的机器指令集,也就是机器语言。编程
早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序经过纸带机或卡片机输入计算机,进行运算。编程语言
用机器语言编写程序,编程人员要首先熟记所用计算机的所有指令代码和代码的涵义。手编程序时,程序员得本身处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程当中每步所使用的工做单元处在何种状态。这是一件十分繁琐的工做。编写程序花费的时间每每是实际运行时间的几十倍或几百倍,并且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。函数
那么该怎么办呢?这时候汇编语言便产生了。工具
须要注意的是如今除了计算机生产厂家的专业人员外,通常是不须要学习机器语言了。学习
汇编语言的主体是汇编指令。汇编指令和机器指令的差异在于指令的表示方法上,汇编指令是机器指令便于记忆的书写格式。
好比下面将寄存器 BX 的内容发送到 AX 上:
操做:寄存器BX的内容送到AX中 1000100111011000 机器指令 mov ax,bx 汇编指令
咱们能很明显的从上面两条指令看出区别,汇编指令相对于机器指令是很容易记住的。
可能有人会问,咱们用汇编语言编写程序,但是计算机只认识机器指令,那该怎么办?这时候就须要一个能将汇编语言转换成机器指令的工具,咱们称其为编译器。程序员用汇编语言写出源代码,再用汇编编译器将其编译为机器码,最后由计算机执行。
汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工做的,处理器能够识别的每一条指令称为机器指令。每一种处理器都有本身能够识别的一整套指令,称为指令集。处理器执行指令时,根据不一样的指令采起不一样的动做,完成不一样的功能,既能够改变本身内部的工做状态,也能控制其它外围电路的工做状态。
汇编语言的另外一个特色就是它所操做的对象不是具体的数据,而是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道,这也是为何汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂,由于既然数据是存放在寄存器或存储器中,那么必然就存在着寻址方式,也就是用什么方法找到所须要的数据。例如上面的例子,咱们就不能像高级语言同样直接使用数据,而是先要从相应的寄存器AX、BX 中把数据取出。这也就增长了编程的复杂性,由于在高级语言中寻址这部分工做是由编译系统来完成的,而在汇编语言中是由程序员本身来完成的,这无异增长了编程的复杂程度和程序的可读性。
再者,汇编语言指令是机器指令的一种符号表示,而不一样类型的CPU 有不一样的机器指令系统,也就有不一样的汇编语言,因此,汇编语言程序与机器有着密切的关系。因此,除了同系列、不一样型号CPU 之间的汇编语言程序有必定程度的可移植性以外,其它不一样类型(如:小型机和微机等)CPU 之间的汇编语言程序是没法移植的,也就是说,汇编语言程序的通用性和可移植性要比高级语言程序低。
总结起来就是三个特色:机器相关性、高速度和高效率、编写和调试复杂(相对于高级语言)。
前面的机器语言和汇编语言咱们都有必定了了解了,汇编语言也是和机器语言同样,都是直接对硬件进行操做,可是汇编语言指令采用了英文缩写的标识符,更容易识别和记忆。可是提及来更容易识别和记忆,也只是相对于机器语言而言的。在实际编程中,汇编语言源程序也是十分复杂和冗长的,这时候高级语言产生了。
高级语言并非指一种语言,而是包括不少编程语言,好比Java、C、C++、C#、python等等,是高度封装的编程语言。高级语言与计算机的硬件结构和指令系统无关,它有更强的表达能力,可方便地表示数据的运算和程序的控制结构,能更好的描述各类算法,并且容易学习掌握。但高级语言编译生成的程序代码通常比用汇编程序语言设计的程序代码要长,执行的速度也慢。
从最开始咱们给出的一张图也能够看出,C语言写出的短短几行代码,翻译成汇编语言会多不少,更不用说变成机器语言了。
首先我要说明的是,咱们不须要学会如何用机器语言,汇编语言来进行编程,毕竟咱们不是计算机生产厂家的专业人员。咱们所要知道的是如何看懂汇编语言就好了。由于在咱们所编写的高级语言,被翻译成汇编语言时,编译器会自动进行一些优化处理,而这些处理若是咱们不知道,就会形成程序上的错误,具体实例后面会详细讲到。
下一篇博客咱们将讲解一个简单的汇编程序实例。