深⼊理解计算机系统(3.1)------汇编语⾔和机器语⾔
《深⼊理解计算机系统》第三章——程序的机器级表⽰。作者⾸先讲解了汇编代码和机器代码的关系,阐述了汇编承上启下的作⽤;接着从机器语⾔IA32着⼿,分别讲述了如何存储数据、如何访问数据、如何完成运算以及如何进⾏跳转。通过这些步骤,⼜告诉了我们分⽀语句、循环语句是怎么完成的,函数调⽤、栈帧结构以及递归过程。最后能通过编译器产⽣的汇编代码表⽰,我们要了解编译器和它的优化能⼒,知道编译器能为我们完成哪些⼯作。
⽽这篇博客我们将讲解汇编和机器代码的关系。⾸先下⾯⼀张图是C语⾔、汇编语⾔以及翻译过的机器语⾔,⼤家可以先有个⼤概的眼熟。
上图引⽤⾄:
1、机器语⾔
这系列博客第⼀篇我们就详细讲解了程序的编译,⼀个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、总结
⾸先我要说明的是,我们不需要学会如何⽤机器语⾔,汇编语⾔来进⾏编程,毕竟我们不是计算机⽣产⼚家的专业⼈员。我们所要知道的是如何看懂汇编语⾔就⾏了。因为在我们所编写的⾼级语⾔,被翻译成汇编语⾔时,编译器会⾃动进⾏⼀些优化处理,⽽这些处理如果我们不知道,就会造成程序上的错误,具体实例后⾯会详细讲到。
下⼀篇博客我们将讲解⼀个简单的汇编程序实例。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论