`

机器指令程序编写方法

阅读更多

处理器本身能理解的机器指令是0和1的序列,让人来写就要大费周章了,因此人们一直在努力开发各种系统,用人类易于理解的形式来编写程序。本节仅简单介绍一下指示处理器工作的机器语言程序的编写方法。

用汇编语言编程

人类很难书写处理器能够理解的0、1序列,也很容易出错。另外,写完后回头看看一堆0和1,根本看不懂会向处理器发出什么指令,即使出了bug、无法正常运行也毫无办法。

因此,我们将加法指令写成ADD,减法指令写成SUBSubtract),从内存读取数据的加载指令写成LDLoad),向内存写入数据的存储指令写成STStore)。这种易于人类理解的写法称为助记符(Mnemonic)。另外,这些指令使用的操作数也可以采用便于人类理解的写法来指定。

利用这些易于人类理解的符号编写程序,再通过汇编器(Assembler)软件,就能转换成机器指令。这种形式的程序叫做“汇编程序”,有时简称汇编。

不过,尽管这样易于人类书写也容易看懂,但是实质上还是得逐条书写机器指令。例如,把AB的结果放入C,就要按照以下步骤计算。

LD R1, [A]      从保存数据A的内存中读取数据放入R1

LD R2, [B]      从保存数据B的内存中读取数据放入R2

ADD R3, R1, R2  R1和R2的内容相加,结果放入R3

ST [C], R3      将R3的内容写入保存数据C的内存地址中

这里的R1R2R3是寄存器(Register),处理器利用它们在计算等操作中保存临时数据。

用汇编语言编程有时也叫做机器语言编程,但毕竟不是直接写0和1,严格来说并不是用机器指令编程。

另外,利用汇编器转换成机器指令后,就是比特序列而已,所以能够像数据一样从输入设备读取到内存中。将程序读入内存的操作称为“加载程序”。

利用编译器进行高级语言编程

为了让编程更方便,人们设想了如下方案:将上述计算写成C=A+B这种人类熟知的形式(即高级编程语言),用这种形式编写程序,再通过编译器(Compiler)转换为汇编程序(图1.17左图)。另外,通常将程序分为主程序与多个子程序的集合,这时需要对主程序和每个子程序分别编译、汇编后(图1.17),用链接器(Linker)合成一个机器语言程序。

1.17  利用编译器和汇编器翻译程序

 1954年,IBMJohn Backus发明了面向科学技术计算的FORTRAN语言,并编写了编译器。后来FORTRAN语言增加了许多功能,即便是现在也被用于科学技术计算程序的开发。

1972年,Bell研究所的研究员Dennis Ritchie构思了C语言并开发了C语言编译器,用来编写UNIX操作系统。后来C语言吸收了面向对象的思想,衍生出了C++C#等语言,成为现在的主要高级编程语言之一。

优化

将高级语言程序翻译成汇编或机器指令时,C=A+B就会被转换成上文中的汇编形式。然而,如果程序预先将AB保存到了某个寄存器,那就不需要重新从内存读入。另外,ADD的结果如果仅在紧随其后的指令中使用,那就不需要保存到内存中,而是通过寄存器直接传给下一条指令,这样就能运行得更快。像这样根据上下文环境省略不必要的操作以生成运行更快的汇编程序,称为优化(Optimization)。

编译高级语言程序时,可以指示编译器怎样优化、优化到什么程度。一般而言,最初的调试阶段不进行优化,调试阶段完成后将编译选项设置为-O2或-O3表示尽量进行优化,以提高性能。

*    *    *

现在,几乎所有的程序都用高级语言编写,再利用编译器和汇编器转换成机器指令。不过,操作系统的某些部分及控制输入/输出设备的硬件操作无法用高级语言表达,所以汇编程序也有用武之地。

解释语言编程

乍一看,解释语言编程跟使用编译器很相似,但它不会对字符串写成的高级语言程序进行编译、汇编等操作,而是在执行时解释程序内容,执行相应的机器指令序列以完成规定的C=A+B等操作。这种方式称为解释(Interpreter)语言。

编程语言中的JavaRuby等就是解释语言,Windows的批处理文件、UNIXLinuxShell脚本也可以算做解释语言。

解释语言在运行时进行编译,将源代码转换成机器指令,因此执行性能并不高,但由于无须在编译、汇编上花费工夫就可以执行程序,修改程序后也不用重新编译、汇编,非常方便,所以应用也很广泛。

编译器和解释器的输入都是硬件无关的高级语言,但编译器的输出结果是汇编程序,或与汇编程序一一对应的机器指令,所以编译结果无法在其他指令架构的处理器上运行。相反,解释程序将高级语言字符串原封不动地作为输入执行程序,因此只要运行程序的计算机系统安装了JavaRuby等解释器,那么无论哪种指令架构的计算机,都可以正常执行JavaRuby程序,而无须为不同指令架构准备不同的二进制程序,具有省时省力的优势。

JIT编译

随着解释程序的增多,解释程序的性能改善也变得势在必行,于是出现了JIT编译(Just In Time Compile)的方式(图1.18),在运行时将程序中反复执行的部分转换为机器语言。JIT编译方式,首先解释执行字符串形式的高级语言程序,一旦发现反复执行的部分,就在运行过程中编译这部分,转换成执行效率较高的机器指令。

  

1.18  拥有JIT编译功能的解释器执行源程序的方式

也就是说,对程序中运行频率较低的部分采用解释方式边解释边运行,而将运行频率较高的部分编译成机器语言以提高执行效率。程序本身仍然是字符串,不会变成机器指令序列,所以它依然保留了与处理器指令构架无关的优点,只要安装了相应语言的处理程序,程序就能正常运行。

但是,即使是运行频率很高的部分,在判断出重复执行之前,只能根据字符串解释运行。此外,JIT编译器会增加编译时间,所以一般来说性能不如编译器编译出的机器指令。但由于它不依赖于处理器架构,所以在商业骨干系统中也得到了应用。

 

 

本文节选自《支撑处理器的技术——永无止境地追求速度的世界》

 

(美)海撒安藤著;

李剑译

电子工业出版社出版

分享到:
评论

相关推荐

    王爽 汇编语言

    在汇编语言中,用助记符(Memoni)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址,如此就增强了程序的可读性和编写难度,象这样符号化的程序设计语言就是汇编语言,因此亦称为...

    单片机程序设计方法-程序设计是单片机开发最重要的工作程序设计

    指令显然用汇编语言写成的程序比机器语言好学也好记所以单片机的指令普遍采用汇编指令来编写 用汇编语言写成的程序我们就叫它源程序或源代码可是计算机不能识别和执行用汇编语言写成的程 序啊怎么办当然有办法我们...

    汇编教程 用汇编语言编写的程序大大提高了程序的可读性

    一方面,汇编语言指令是用一些具有相应含义的助忆符来表达的,所以,它要比机器语言容易掌握和运用,但另一方面,它要直接使用CPU的资源,相对高级程序设计语言来说,它又显得难掌握。

    安川机器人程序中断程序编写

    安川中断

    51CTO下载-西安电子科技大学的编译原理课件

    由于机器指令程序不易理解,用它编写程序既困难又容易出错,于是人们就用容易记忆的符号来代替0、1字符串。用符号表示的指令被称为汇编指令,汇编指令的集合被称为汇编语言,由汇编语言编写的指令序列被称为汇编语言...

    汇编零起点教学 ,汇编语言指令是用一些具有相应含义的助忆符来表达的,所以,它要比机器语言容易掌握和运用,但另一方面,它要直接使用CPU的资源,相对高级程序设计语言来说,它又显得难掌握。

    调试工具落后,高级语言程序可以在源程序级进行符号跟踪,而汇编语言程序只能跟踪机器指令。不过,现在这方面也有所改善,CV(CodeView)、TD(Turbo Debug)等软件也可在源程序级进行符号跟踪了。

    计算机组成原理实验报告(包括12356份)

    (2)本实验扩展了16条机器指令,综合运用所学的计算机原理知识,用扩展机器指令设计编写程序,通过CPU运行所编写的程序。 2. 实验方案: ① 按实验指导书上的图6-3在实验仪上接好线后,仔细检查无误后可接通...

    汇编语言程序设计全部实验报告.zip

    汇编语言实验一查看CPU和内存,用机器指令 汇编语言实验二用机器指令和汇编指令编程 汇编语言实验三编程·编译·链接·跟踪 汇编语言实验四[bx]和loop的使用 汇编语言实验五编写,调试具有多个段的程序 汇编语言实验...

    mbot机器人巡线程序-mBot机器人编程——用机器人的逻辑思考问题.pdf

    mbot机器⼈巡线程序_mBot机器⼈编程——⽤机器⼈的逻辑思 考问题 mBot机器⼈编程 ——⽤机器⼈的逻辑思考问题 ⽂/陈林 提到机器⼈,想必⼤家都不会陌⽣。但如果问到什么是机器⼈时,似乎⼼中的答案并不是那么的确切...

    汇编语言教程电子书 chm

    汇编语言教程 电子书 chm ...解决该问题就需要一个翻译程序,它能把汇编语言编写的源程序翻译成CPU能识别的机器指令序列。这里,我们称该翻译程序为汇编程序。 图1.1是汇编程序翻译过程的示意图。

    汇编语言图文并茂版本

    由于机器指令与CPU紧密相关,所以,不同种类的CPU所对应的机器指令也就不同,而且它们的指令系统往往相差很大。但对同一系列的CPU来说,为了满足各型号之间具有良好的兼容性,要做到:新一代CPU的指令系统必须包括...

    计算机组成原理 课程设计

    设计一个基本模型机,为其定义几条机器指令并编写相应的为程序, 完成算术及逻辑运算。能在微程序控制下自动产生各部件单元的控制信号,实现特定指令的功能。这里,计算机数据通路的控制将由微程序控制器来完成,CPU...

    微程序控制器的CPU设计

    1) 拟定指令系统(含机器指令的字长、格式、寻址方式及指令的种类等) 2) 设计数据通路,给出模型机中所含的部件及其间的连接,以及信息在数据通路中传送时所需的微命令。 3) 设计微程序的流程图 4) 设计微指令 5) ...

    计算机程序设计——程序设计语言.docx

    计算机程序设计——程序设计语言全文共2页,当前为第1页。计算机程序设计——程序设计语言全文共2页,当前为第1页。计算机程序设计——程序设计语言 计算机程序设计——程序设计...机器语言程序难编写、难修改、难维

    DELPHI编写的后门程序

    (密码正确按回车)Microsoft Windows XP [版本 5.1.2600] (回车后得到对方机器的dos)<C> 版权所有 1985-2001 Microsoft Corp.c:>d (输入DOS命令,这里只能输入一个字符,但他和下面的是一起的注意,由于程序的原因...

    《大学计算机基础》程序设计-综合习题.doc

    A 程序价格便宜、软件价格昂贵 B 程序是用户自己编写的,而软件是由厂家提供的 C 程序是用高级语言编写的,而软件是由机器语言编写的 D 软件是程序以及开发、使用和维护所需要的所有文档的总称,而程序是软件的一部 ...

    mips.zip_MIPS_mips指令机器码_sub_二进制mips_汇编指令sw

    C编写的程序,将MIPS汇编指令转换为机器码,并以二进制方式存盘。实现指令add/and/sw/sub/slt.

    人事管理系统程序设计语言

    机器语言是表示成数码形式的机器基本指令集,或者是操作码经过符号化的基本指令集。汇编语言是机器语言中地址部分符号化的结果,或进一步包括宏构造。高级语言的表示方法要比低级语言更接近于待解问题的表示方法,其...

    利用Matlab编写代码的便捷方法.docx

    函数是一种可以接收输入参数并输出结果的程序,而脚本则是一系列命令的集合。使用函数可以更好地组织代码,使其更易于阅读和维护。在编写函数时,要注意函数的输入和输出,以及函数内部的变量和处理逻辑。 ## 2. ...

    单寄存器算术\存数\转移\输入输出指令实验计算机设计(第1组)

    利用EL-JY-II型计算机组成原理实验仪提供的硬件资源,...4、 通过如下程序的编写调试,验收机器指令、微指令、微程序的设计结果。 IN #data,R0 ADD R0,addr1 STA R0,addr2 OUT addr2 JMP 00H Addr1: XX Addr2: XX

Global site tag (gtag.js) - Google Analytics