映射语言

科技工作者之家 2020-11-17

映射语言是一种面向中间语言的程序设计语言。语言的基础是一组记号和一组规则,根据规则由记号构成的记号串的总体就是语言,而这些记号串就是程序。映射语言同样有三个方面的因素,即语法、语义和语用。这种语言需要满足心理、工程及技术等特性。首先满足心理特性:歧义性、简洁性、局部性、顺序性和传统性;其次满足工程特性:可移植性、开发工具的可利用性、软件的可重用性、可维护性;最后满足技术特性:支持结构化造型的语言有利于减少程序环路的复杂性,使程序易测试、易维护。

映射器输入所定义的映射语言编写的源程序代码,在映射器的映射下可以高效转化为不同处理器上各自执行的汇编语言代码,具体过程如图1所示。

在语法方面,映射语言的语法形式类似于 C 语言,它的部分语句可借用高级语言中实现特定功能的函数形式表达。在语义方面,映射语言程序通过映射器的执行以生成各种不同处理器对应的程序指令。映射语言和 X86、ARM 和 MIPS 处理器上运行的汇编指令存在一种映射关系,形式上不同于一般的汇编指令,省去了复杂的助记符表示形式。映射语言借鉴高级语言命令的构建方法,建立了一套基本完整的映射语言词法、语法规则,除了实现一些基本功能的命令外,还可以很容易的通过语句的组合和嵌套来实现较为复杂的功能,具备了一定的可扩展性和延展性。映射语言从设计之初便是为了实现平台无关性,以及从映射语句到各种不同处理器上汇编指令的映射,有效地避开了目标处理器指令系统的复杂细节,满足了多平台使用的需求1。

映射语言的寻址一般的汇编指令均带有一个或以上的操作数,那么就必须表明以什么样的方式来获取操作数,获得操作数的方式称为操作数的寻址方式。

操作数的来源主要有三种:指令中的立即数、寄存器中的寄存器操作数和内存中的存储器操作数。对于存储器操作数,一种可以通过给出的存储器地址获得其中的内容,地址可以间接由寄存器给出,或直接为物理地址,存储器操作数可表示为“[寄存器名]”或“[物理地址]”;一种是直接由变量代表存储器中的内容。映射语言的形式接近高级语言形式,所以,汇编语言指令中所特有的寻址方式在映射语言中将以赋值语句的方式出现。赋值语句通过等号“=”连接,将等号右边的操作数赋给等号左边的操作数。针对以上操作数的三种来源,映射语言的赋值语句形式主要可分为以下五种:

第一种:直接将立即数的值赋给寄存器或存储器,即对应于汇编指令的立即寻址;

第二种:将寄存器的值赋给另一寄存器,即对应于汇编指令的寄存器寻址;

第三种:存储器与寄存器之间的数据传送,当存储器地址用寄存器内容给出时,即对应于汇编指令的寄存器间接寻址;

第四种:以物理地址或寄存器的值与“变址”的值之和为地址,在存储器中找到该地址中的值赋给寄存器,即对应于汇编指令的基址变址寻址;

第五种:存储器之间的数据传送,形式上为变量之间相互赋值。

下面将详细介绍五种赋值语句的格式并举例加以说明。

a. 第一种

最简单直接的方式给出操作数的方法,就是在赋值语句中将立即数的值直接赋给寄存器或存储器,操作数可以是有符号数或无符号数。它的主要功能是给寄存器或者存储单元赋初值,也可以用来与寄存器操作数或者存储器操作数进行算术运算或逻辑运算,并且还要注意的是立即数不能在等号左边的位置出现。例如:(1). R1= 1234H; (2). [2000H] =5; (3). X=0;意义:这三条赋值语句功能分别是:将 16 位立即数 1234H 传送到 R1 寄存器中;将立即数 5 赋值给地址为 2000H 的存储器中;将变量 X 初始化为 0。

b. 第二种

操作数均在 CPU 的寄存器中,等号左右两侧是寄存器的代号,进行寄存器之间的数据传送。例如:R1= R2;意义:这里的操作数 1(R1)、操作数 2(R2)均在寄存器中,功能是将寄存器 R2的值赋给寄存器 R1 中。

c. 第三种

操作数的内容在存储器或寄存器中,用“[寄存器名]”表示从以寄存器内容为地址的存储器中获取操作数,用“[物理地址]”表示直接从存储器物理地址中获取操作数。例如:(1). R1= [R2] ; (2). R3=[2000H];(3). R4= x;意义:(1)中以 R2 寄存器里的值作为操作数的地址,以此地址在存储器中找到操作数赋给寄存器 R1;(2)中将存储器物理地址为 2000H 的内容赋值给 R3;(3)中直接将存储器中的内容 x 赋值给寄存器 R4。说明:变量或表示地址的“[寄存器名]”、“[物理地址]”在等号左侧时,表示将等号右侧的寄存器操作数送至保存此变量或此地址的存储器中。

d. 第四种

这种赋值方式是在第三种的基础上扩展出来的,操作数的内容放在存储器中,但操作数的地址不仅通过寄存器的内容或物理地址来获得,还多了一项地址偏移量。以寄存器内容与或物理地址的值与偏移量的和作为操作数的总地址,通过这个地址在存储器中取得操作数,用“偏移量[寄存器名]”或“偏移量[物理地址]”表示。偏移量可以由寄存器内容或立即数提供。例如:(1). R1=R3 [R2] ; (2). R4=2 [R5];(3). R6=08H [2001H]意义:(1)、(2)中,分别将 R2 和 R3 中的内容相加或 R5 中的内容与 2 相加得到操作数的地址,在存储器中找到这个地址中存放的数据,将它赋给 R1 或 R4 寄存器。(3)中,从以 2009H(2001H+08H)为地址的存储器中得到操作数赋给 R6。

e. 第五种

将存储器某一地址单元中的内容赋值给另一地址单元的内容。操作数均存在于存储器中,以变量的形式表达。例如:x = y;汇编语言中并没有存储器之间相互传递数据的指令,所以在汇编语言中,将映射语言变量之间的赋值用 2 条寄存器与存储器之间的数据传送指令表示。

映射语言的语句映射语言语句概述指令是让计算机完成某种操作的命令,指令系统是指令的集合,不同系列的计算机有不同的指令。汇编语言的指令是将二进制代码表示的机器指令用英文字母或者符号表示出来,增强指令的可读性,并且汇编与机器指令一一对应。

定义的映射语言,在形式上接近高级语言,所以,类似于汇编的指令,映射语言有自己实现不同功能的命令语句,它用来向计算机发出该如何进行操作的命令。一个程序中包含若干条语句,理论上可以支持 X86、ARM 和 MIPS 处理器中所有的指令。它使用类似高级语言形式的语句运算符代替了各种复杂多样难以记忆的汇编指令助记符,屏蔽了各种不同汇编指令集的复杂性,并且用映射语言将不同处理器的汇编指令统一起来,做到跨平台使用,增强指令的可移植性,也保证了良好的目标处理器扩展性。

对于映射语言的语句,本章从语句的类型和形式方面加以详细的介绍,并给出映射语言的语句符号映射表。

映射语言的语句类型及形式汇编语言的指令是由操作数和操作码两部分组成,而映射语言的语句只保留操作数部分,摒弃了复杂的操作码,将其用简单的运算符号代替,更简洁明了。映射语言语句的操作数可以是两个或者三个,操作数的类型可以是存储器、寄存器或者变量,提供了操作数从哪里得到、结果送到哪里等信息。经过在第二章中对 X86、ARM 和 MIPS 处理器的指令集介绍,可以总结出映射语言的语句类型。映射语言共有 6 种类型,分别为:

1、赋值语句;

2、表达式语句;

3、函数调用语句;

4、控制语句;

5、复合语句;

6、其他语句。

下文将逐一对这六种语句进行讨论。

a.赋值语句

实现 CPU 和存储器、CPU 与外设之间、寄存器之间和存储器之间的数据传送.

b. 表达式语句

映射语言表达式语句包括算术运算表达式语句、逻辑运算表达式语句、关系表达式语句和移位表达式语句。

(1)算术运算表达式语句

提供加、减、乘、除这四种最基本的算术运算功能,并且可用于有符号数和无符号数的运算,有无符号在语句上并无区别,只在类型声明中需要特别说明。操作数 1、2 的类型可以是寄存器或存储器;操作数 3 的类型可以是寄存器、存储器或立即数。形式:操作数 1 = 操作数 2 op 操作数 3;op 为运算符“+”、“-”、“*”或“/” 例如: R1=R2+[R3];R4=R4-X;R5=R6*R7;R8=R9/6;X=R10-1;功能:完成两个操作数加、减、乘或除的操作,结果赋给操作数 1,操作数 2、3 的值不变。加减运算中,当操作数 1 与操作数 2 相等,且操作数 3 为常数 1 时,可完成操作数 1 自增或自减的功能;乘法运算中,操作数 2、3 的初始值位数相同且最大为 16 位。

(2)逻辑运算表达式语句

映射语言的逻辑运算表达式语句提供的是对二进制位的操作功能,可以直接对寄存器或存储器中的位进行操作,通过按位逻辑运算操作,可以达到不同的目的。映射语言提供与、或、非、异或这四种逻辑运算。

i. 形式:操作数 1 = 操作数 2 op 操作数 3,op 为“&”、“|”、“^”。

例如:R1=R2&0FH;R3=R4|30H;R5=R6^R6;

功能:操作数 2 和操作数 3 做逻辑按位与(&)、或(|)、异或(^)操作,结果赋给操作数1,操作数 2、3 的值不变。需要说明的是:操作数 1、2 为寄存器,操作数 3 可以是寄存器,也可以为立即数;当作逻辑异或运算时,操作数 2 与操作数 3 相同,则可完成清零操作。

ii. 形式:操作数 1 = ~ 操作数 2.

例如:R1=~R2;X=~R3;

功能:将操作数 2 中的内容按位取反后,将结果赋给操作数 1,操作数 1、2 为寄存器或存储器。

(3)关系表达式语句

映射语言的关系表达式语句是由!=、>、=、”、“=”、“0;R1-1)

功能:for()循环控制语句,init 表示初始值,cond 表示条件,expr 为算数运算表达式,说明值的变化情况。

(3)跳转语句

形式:goto Label;

例如:goto L1;

功能:用来改变程序的执行顺序,表示直接跳转至指定程序段处,Label 可以是任一程序段处的标号名(L1)。映射语言的跳转语句在形式上并不区分条件或非条件转移,若是转移需要附加条件,则用 if 条件语句+goto 语句配合完成。

(4)从函数返回语句

形式:ret 返回值;

功能:函数返回语句,一般在有返回值的函数中使用,表示调用子函数结束,将值返。

e. 复合语句

映射语言中,用“{}”将一些语句列表括起来成为复合语句。映射语言中还有 2 个函数命令语句,他们同样在编程中起到必不可少的作用,以下给出这两个函数并介绍其功能。

本词条内容贡献者为:

王慧维 - 副研究员 - 西南大学

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。