CN101145109A - 利用中间指令集的二进制翻译方法 - Google Patents
利用中间指令集的二进制翻译方法 Download PDFInfo
- Publication number
- CN101145109A CN101145109A CNA2007100476978A CN200710047697A CN101145109A CN 101145109 A CN101145109 A CN 101145109A CN A2007100476978 A CNA2007100476978 A CN A2007100476978A CN 200710047697 A CN200710047697 A CN 200710047697A CN 101145109 A CN101145109 A CN 101145109A
- Authority
- CN
- China
- Prior art keywords
- register
- instruction
- metainstruction
- source machine
- machine
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Executing Machine-Instructions (AREA)
Abstract
本发明涉及一种利用中间指令集的二进制翻译方法,设计一套中间指令集作为从一种机器指令翻译到另一种机器指令时的中间层,有效隔开源机器与目标机器。中间指令集包含与主流机器指令集相匹配的基本指令,分为寄存器状态映射指令、内存访问指令、数据移动指令、运算指令、控制转移和特殊指令。在将机器指令翻译为中间指令时,将一些最常用的源机器指令直接映射到某条中间指令,而对于不常用源机器指令则可以翻译成多条中间指令或者用C函数模拟。本发明采用中间指令集准确表达各种体系结构机器的指令,大大减小了二进制翻译器支持多种源与目标机器平台的复杂性,实现了二进制翻译器可重定向性,对优化二进制翻译器系统结构和系统性能起到关键作用。
Description
技术领域
本发明涉及一种利用中间指令集的二进制翻译方法,利用一套用于二进制翻译的中间指令集,可以将一种物理机器指令翻译为另一种物理机器指令。本发明属于二进制翻译技术领域。
背景技术
二进制翻译是一种仿真技术,涉及“源”(Source)与“目标”(Target)两个机器平台,因此二进制翻译器与机器平台有强烈的依赖关系,这对基础平台的可移植性提出了更高的要求,可重定向性就是其中要求之一。可重定向性是指基础平台对多种源机器与目标机器的支持,并且能够很容易地移植到新的机器平台,中间指令有效地隔开了源机器与目标机器,是实现可重定性的关键。在二进制翻译器中,如果要在x86,ARM,MIPS三种机器代码之间进行翻译,需要实现3×3=9种翻译过程,如果在“源”与“目标”两个机器平台放入一种中间指令作为中间层次,只需要实现3+3=6种翻译过程,因此中间指令大大减小了二进制翻译器支持多种源与目标机器平台的复杂性。
中间指令是一种中间语言,中间语言最初来自于编译器,编译器一般首先将程序源代码转换成一种更适合于优化分析的形式,即在生成目标机器代码前的中间步骤。在传统的静态编译器中,编译器一般采用一种或多种与机器无关的中间语言作为中间层次,大部分的代码转化与优化工作都针对该中间语言,从而使编译器的大部分模块能够与机器无关,在编译过程中从一种中间语言转换至另一种形式,以在不同的阶段适合于不同的需求,但增加中间步骤的级数也意味着增加额外的编译开销。在动态二进制翻译器或动态编译器等动态的运行时系统中,运行时的编译开销直接影响了程序的运行时性能,因此动态二进制翻译器一般不值得采用多重的中间形式。
如果在二进制翻译中使用现有的中间语言,则需要考虑它对新的使用环境的适应性问题——既包括前端语言也包括后端语言;要考虑实现它所产生的移植代价与重用现有设计和代码所固有的开销之间的权衡;现有的中间语言都针对编译器设计,其源语言为一种高级程序设计语言,目标语言为机器语言,而在二进制翻译中,源程序和目标语言均为机器语言,因此中间语言应该是机器级语言,因此现有中间语言并不完全适合于二进制翻译的应用环境。
因此需要发明一套全新的二进制中间指令集,用中间指令集准确表达各种体系结构机器的指令,使之可以应用于各种二进制翻译器。
发明内容
本发明的目的在于针对现有技术的不足,提供一种利用中间指令集的二进制翻译方法,解决二进制翻译器对各种新的应用环境的适应性问题,减小二进制翻译器支持多源与多目标机器平台的复杂性,实现二进制翻译器可重定向性。
为实现这一目的,本发明针对二进制翻译器的特点设计了一套中间指令集,作为从一种机器指令翻译到另一种机器指令时的中间层,有效隔开源机器与目标机器。所述中间指令集是一种低层次的虚拟精简机器指令系统,它具有无穷多个32位寄存器、Load-Store风格体系结构、单一的偏移寻址模式。中间指令的设计遵循计算机系统设计中的一条基本原则:使执行频繁的部分保持高效,使其他的部分保持正确。中间指令集包含了各种机器指令集中一些最常用的指令,剩下相对不常用的源机器指令可以用多种中间指令模拟,也可以利用CALL中间指令,即C函数模拟。
本发明的中间指令集包含与主流机器指令集(包括RISC与CISC)相匹配的基本指令,可分为寄存器状态映射指令、内存访问指令、数据移动指令、运算指令、控制转移、和特殊指令共六类指令。在将机器指令翻译为中间指令时,将一些最常用的源机器指令直接映射到某条中间指令,而对于一些不常用源机器指令可以翻译成多条中间指令或者用C函数模拟。
本发明采用中间指令集进行二进制翻译的方法具体步骤如下:
1.映射源机器寄存器到虚拟寄存器
定义中间指令集具有无穷多个32位寄存器,称虚拟寄存器,记作vn,其中v0永远代表零值。首先分析源机器指令中将要使用的源机器寄存器,然后通过寄存器状态映射指令GET s,v、FGETS s,v和FGETD s,v,将源机器寄存器映射至虚拟寄存器,将源机器指令对源机器寄存器的状态改变对应到中间指令对虚拟寄存器的改变,从而建立源机器寄存器到虚拟寄存器的映射关系。
2.将源机器指令翻译为中间指令
将最常用源机器指令直接映射到某条中间指令,而对于不常用源机器指令则翻译成多条中间指令或者用C函数模拟。其中,
加载数据至虚拟寄存器时,采用中间指令LD(v,imm),sz,v和FLD(v,imm),sz,fp将源机器指令中包含的内存数据加载至虚拟寄存器,采用中间指令LI imm,v将源机器指令中包含的立即数imm)值赋给虚拟寄存器v,采用中间指令MOV v1,v2在虚拟寄存器之间移动数据。
处理虚拟寄存器中的数据时,分析源机器指令所包含的运算操作,根据源机器指令语义用中间指令中的一条或几条运算指令将源机器指令的运算准确表达出来,采用算术计算指令完成算术运算,采用逻辑计算指令完成逻辑运算,采用移位运算指令完成移位操作,采用条件比较指令完成条件比较。
控制中间指令的执行顺序时,分析源机器指令中所包含的跳转,用中间指令直接跳转JMP和分支跳转BRANCH来表示源机器指令的跳转。
将数据运算结果写回时,分析源机器指令,用中间指令写回指令执行的结果,采用中间指令MOV v1,v2在虚拟寄存器之间移动数据,将结果写回虚拟寄存器,采用中间指令ST v,sz,(v,imm)和FST fp,sz,(v,imm)将虚拟寄存器中的数据写回至内存。
采用特殊指令完成一些特定的二进制翻译系统的功能,包括系统调用SYSCALL,中止运行HALT,函数调用CALL w1,w2,w3…。
3.建立虚拟寄存器与目标机器寄存器的映射关系
定义虚拟寄存器的Next-Use是下一次使用该虚拟寄存器的中间指令在指令流中的位置;当目标机器寄存器数目大于等于源机器寄存器数目时,将所用到的虚拟寄存器一一对应到目标机器寄存器;当目标机器寄存器数目小于源机器寄存器数目且有空闲目标机器寄存器时,则将虚拟寄存器映射到空闲的目标机器寄存器;当目标机器寄存器数目小于源机器寄存器数目且没有空闲目标机器寄存器时,则将虚拟寄存器映射到具有最大Next-Use值的目标机器寄存器。
4.将中间指令集映射到目标机器指令集
对中间指令进行编码,生成目标机器二进制代码,将中间指令集映射到目标机器指令;对于不能直接映射到机器指令的中间指令,用C函数实现。
5.将虚拟寄存器映射回源机器寄存器
用PUT v,s、FPUTS v,s、FPUTD v,s指令将虚拟寄存器映射至源机器寄存器,建立虚拟寄存器到源机器寄存器的映射关系,从而将中间指令对虚拟寄存器的改变对应到源机器指令对源机器寄存器的状态改变,使源机器指令在源机器上的执行结果与在目标机器上的执行结果相同。
本发明采用中间指令集准确表达了各种体系结构的机器指令,大大减小了二进制翻译器支持多源与多目标机器平台的复杂性,中间指令集有效地隔开了源机器与目标机器,是实现二进制翻译器可重定向性的关键,在优化二进制翻译器系统结构和系统性能方面起到了关键的作用。本发明针对二进制翻译器特点和现在技术的不足,考虑了中间指令对新的使用环境的各种适应性问题——既包括前端的语言也包括后端的语言,也考虑了实现它所产生的移植代价与重用现有设计和代码所固有的开销之间的权衡,因此它可以广泛的应用于各种二进制翻译器。
具体实施方式
为更好地理解本发明的技术方案,以下通过具体的实施例作进一步描述。以下实施例不构成对本发明的限定。
在用中间指令集实现源机器指令功能时,要准确理解源机器指令语义,源机器指令的操作会产生哪些结果,中间指令应该能将源机器指令产生的所有结果表达出来。中间指令集包含了各种机器指令集中的最常用四十余条指令,对这些源机器指令,只需直接映射到中间指令;其余相对不常用的源机器指令或用多条中间指令模拟,或利用CALL中间指令调用函数,即C函数模拟。
在说明源机器指令翻译为中间指令的过程之前,首先说明中间指令的操作数的类型、助记符和含义,如下表1所示。
表1
操作数类型 | 助记符 | 含义 |
SREG | S | 源机器寄存器 |
VREG_USE | V | 目标机器寄存器(USE) |
VREG_DEF | V | 目标机器寄存器(DEF) |
IMM | Imm | 32位立即数 |
SIZE | Sz | 操作数据大小,包括BYTE(8),HALFWORD(16),WORD(32) |
CC | Cc | 条件码,包括EQ,NE,GT,GE,LT,LE,AB,BE |
WORD | W | 一个字的数据 |
1、映射源机器寄存器到虚拟寄存器
二进制翻译器在内存中模拟源机器处理器,因此源机器寄存器状态也在内存中。定义中间指令集具有无穷多个32位寄存器,称为虚拟寄存器,记作vn,其中v0永远代表零值,这使中间指令与物理机器平台的寄存器数目无关。具体的物理寄存器分配推迟到中间指令到目标指令翻译时进行。
使用中间指令集中的寄存器状态映射指令GETs,v、FGETS s,v和FGETDs, v,将源机器寄存器映射至虚拟寄存器,将源机器指令对源机器寄存器的状态改变对应到中间指令对虚拟寄存器的改变,从而建立源机器寄存器到虚拟寄存器的映射关系。
所有机器指令的行为表现为对其处理器寄存器状态的改变,如运算指令表现为对目标寄存器的修改,跳转指令表现为对程序计数器的修改。建立源机器寄存器和虚拟寄存器的映射关系,可以使生成的中间指令精确模拟源机器程序的行为。
源寄存器状态到虚拟寄存器映射指令的语义如下:
GET s,v将源整点寄存器s映射至虚拟寄存器v
FGETS s,v将源单精度浮点寄存器s映射至虚拟寄存器v
FGETD s,v将源双精度浮点寄存器s映射至虚拟寄存器v
2、将源机器指令翻译为中间指令
由于中间指令集包含各种源机器指令集中一些最常用的指令,因此在将机器指令翻译为中间指令时,将最常用的源机器指令直接映射到某条中间指令,而对于不常用源机器指令或者翻译成多条中间指令或者用C函数模拟。在将源机器指令翻译为中间指令时,则用下述步骤中的某些步骤。
(1)加载数据至虚拟寄存器
首先分析源机器指令中包含的数据,这些数据可能是内存数据、立即数、寄存器中数据。
(a)采用中间指令LD(v,imm),sz,v和FLD(v,imm),sz,fp将源机器指令中包含的内存数据加载至虚拟寄存器:
LD(v,imm),sz,v将内存地址v(imm)处大小为sz的数据装载至虚拟寄存器v;
FLD(v,imm),sz,fp将内存地址v(imm)处大小为sz的数据装载至浮点寄存器fp;
其中,vn(disp)表示内存地址,其值为寄存器vn的值加上偏移量disp。内存访问涉及三个变量内存地址、访问数据大小和目的寄存器,其中内存地址用寄存器加偏移量的形式表达,因此中间指令LD(v,imm),sz,v和FLD(v,imm),sz,fp均包含四个参数。
在读取内存数据时,当读取的数据小于虚拟寄存器的大小时,应当进行符号填充和扩展,但中间指令LD(v,imm),sz,v和FLD(v,imm),sz,fp不会自动进行填充和扩展,需进行人工填充和扩展,本发明提供了另外两条中间指令SEXT和ZEXT,可以利用这两条指令进行符号扩展与无符号扩展操作。这反映了本发明设计中细颗粒度的原则。
(b)用LI imm,v指令加载立即数至虚拟寄存器:
LI imm,v将立即数imm值赋给虚拟寄存器v。
(c)用MOV v1,v2指令将数据在虚拟寄存器之间移动:
MOV v1,v2将虚拟寄存器v1的值赋给v2。
(2)处理虚拟寄存器中的数据
处理虚拟寄存器中的数据时,分析源机器指令所包含的运算操作,根据源机器指令语义用中间指令中的一条或几条运算指令将源机器指令的运算准确表达出来。指令主要包括算术计算指令,逻辑计算指令,移位运算指令和条件比较指令等。采用算术计算指令完成算术运算,采用逻辑计算指令完成逻辑运算,采用移位运算指令完成移位操作,采用条件比较指令完成条件比较。
运算指令的操作数数目是指令集设计的要素之一,RISC体系结构一般采用三操作数,而CISC体系结构一般采用二操作数,其中的一个操作数既是源操作数也是目的操作数。本中间指令集的运算指令采用了三操作数,即除了两个源操作数外,用一个额外的寄存器存放目的操作数。这样设计的优点很明显,三操作数的指令能够很容易地适应到二操作数指令:
add x,y=>ADD x,y,y#x+y=>y反之,三操作数指令需要翻译到两条二操作数指令:
add x,y,z=>MOV x,z;#x=>z
ADD y,z#y+z=>z下面对这些指令的语义一一说明。
(a)算术计算指令
算术计算指令用来完成算术运算,算术计算指令分为整点运算指令和浮点运算指令,浮点运算指令又包括单精度运算指令、双精度浮点运算指令。算术计算指令的含义如表2所示。
表2
ADD v1,v2,v3 | 整点运算,将v1加上v2的结果赋给v3 |
SUB v1,v2,v3 | 整点运算,将v1减去v2的结果赋给v3 |
MUL v1, v2,v3,v4 | 整点运算,将v1与v2有符号乘的结果赋给v3,v4 |
MULU v1,v2,v3,v4 | 整点运算,将v1与v2无符号乘的结果赋给v3,v4 |
DIV v1,v2,v3,v4 | 整点运算,将v1与v2有符号除的结果赋给v3,v4 |
DIVU v1,v2,v3,v4 | 整点运算,将v1与v2无符号除的结果赋给v3,v4 |
FADDS v1,v2,v3 | 单精度浮点运算,将v1加上v2的结果赋给v3 |
FSUBS v1,v2,v3 | 单精度浮点运算,将v1减去v2的结果赋给v3 |
FMULS v1,v2,v3,v4 | 单精度浮点运算,将v1与v2乘的结果赋给v3,v4 |
FDIVS v1,v2,v3,v4 | 单精度浮点运算,将v1与v2除的结果赋给v3,v4 |
FNEGS v1.v2 | 单精度浮点运算,将v1取反赋给v2 |
FABSS v1.v2 | 单精度浮点运算,将v1取绝对值赋给v2 |
FSQRTS v1.v2 | 单精度浮点运算,将v1取平方根赋给v2 |
FADDD v1,v2,v3 | 双精度浮点运算,将v1加上v2的结果赋给v3 |
FSUBD v1, v2,v3 | 双精度浮点运算,将v1减去v2的结果赋给v3 |
FMULD v1,v2,v3,v4 | 双精度精度浮点运算,v1与v2相乘结果赋给v3,v4 |
FDIVD v1,v2,v3,v4 | 双精度浮点运算,将v1与v2除的结果赋给v3,v4 |
FNEGD v1 v2 | 双精度浮点运算,将v1取反赋给v2 |
FABSD v1 v2 | 双精度浮点运算,将v1取绝对值赋给v2 |
FSQRTD v1.v2 | 双精度浮点运算,将v1取平方根赋给v2 |
(b)逻辑计算指令
逻辑计算指令用来完成逻辑运算。逻辑计算指令的含义如表3所示。
表3
AND v1,v2,v3 | 整点运算,将v1逻辑与v2的结果赋给v3 |
OR v1,v2,v3 | 整点运算,将v1逻辑或v2的结果赋给v3 |
XOR v1,v2,v3 | 整点运算,将v1逻辑异或v2的结果赋给v3 |
NOT v1.v2 | 整点运算,将v1取反的结果赋给v2 |
(c)移位运算指令
移位运算指令用来完成移位运算。移位计算指令的含义如表4所示。
表4
SLL v1, v2,v3 | 整点运算,将v1逻辑左移v2位后的结果赋给v3 |
SRL v1,v2,v3 | 整点运算,将v1逻辑右移v2位后的结果赋给v3 |
SRA v1,v2,v3 | 整点运算,将v1算术右移v2位后的结果赋给v3 |
SEXT v1 sz,v2 | 整点运算,将v1的低sz部分符号扩展后赋给v2 |
ZEXT v1 sz,v2 | 整点运算,将v1的低sz部分无符号扩展后赋给v2 |
移位操作接受三个参数:源操作数,移位数,目标操作数。在很多指令集中移位数一般以立即数给出,但在中间指令集中则以寄存器指定,这样能使中间指令集同时适应以立即数和寄存器为移位数的指令集。比如,对于常见的移位数为立即数的情况,可以先用LI指令将立即数加载至寄存器:
SLL x,imm,y => LIimm, v # imm=>v
SLL x,v,y #x>>reg[v]=>y
SEXT与ZEXT指令一般与LD(或ST)指令配合使用,从内存读取一定大小数据保存入寄存器的同时进行符号或无符号扩展以填充整个寄存器,以MIPS的1b指令(从内存读取一个有符号字节)为例:
1b rt,offset(rs)=>LD(rs,offset),BYTE,rt
SEXT rt,BYTE,rt
(d)条件比较指令
条件比较指令用来完成比较操作。条件计算指令的含义如表5所示。
表5
CMP cc,v1,v2,v3 | 整点运算,将v1和v2根据条件码cc进行比较,若结果为真,v3为1,若结果为假,v3为0 |
FCMPS cc,v1,v2,v3 | 单精度浮点运算,将v1和v2根据条件码cc进行比较,若结果为真,v3为1,若结果为假,v3为0 |
FCMPD cc,v1,v2,v3 | 双精度浮点运算,将v1和v2根据条件码cc进行比较,若结果为真,v3为1,若结果为假,v3为0 |
(3)控制中间指令的执行顺序
控制程序执行顺序的中间指令包括直接跳转(JMP)以及分支跳转(BRANCH)。JMP(v,disp)是直接跳转到v(disp)内存地址;BRANCH cc,v1,v2,(v,disp)跟据条件码cc比较v1与v2,如果结果为真,跳转到v(disp)内存地址。
分支转移是机器指令集设计的重要部分之一。首先,分支转移可以用一条指令或两条指令完成。如果用两条指令来完成分支转移,一般会先有一条TEST或COMPARE指令比较分支条件是否成立,将结果保存在寄存器中;然后再用第二条指令根据结果进行控制流的转移。如果用一条指令来完成分支转移,这条指令必须包含比较条件、比较的操作数和控制转移的目标地址。在各种RISC和CISC机器中都有两种分支转移的实现方法。例如,在MIPS的指令集中,有BEQ(Branch if EQual)、ELTZ(Branch if Less Than Zero)等用一条指令完成分支转移的指令;同时,MIPS也提供了SLT(Set if Less Than)系列指令用于和BEQ系更指令配合用两条指令完成分支转移。在x86中,分支转移主要用先判断(CMP)再转移(Jcc)的方式实现。因此,为了适合于不同的机器指令集,中间指令同时提供了这两种分支方式,其中BRANCH指令可以单独用于分支转移,也可以和CM P指令配合使用。
其次,如果使用了两条指令的方式实现分支转移,还需要考虑是否使用条件码标志位(Condition Codes Flag)保存操作数的比较结果。条件码标志位是处理器内部的状态量,通常包括是否为零(ZF)、是否溢出(OF)、是否为负数(SF)、是否有进位(CF)等状态,一般以运算指令副作用的方式更新,即每条相关运算指令结束后都会根据结果更新这些标志位。条件码标志位出现在很多CISC和RISC机器中,包括流行的x86和ARM体系结构。条件码标志位最大的优点在于省去了多余的TEST或COMPARE指令,比较操作往往可以通过另一条运算指令“附带”完成。但是,条件码标志位增加了指令间不必要依赖关系,使分支跳转指令在位置上依赖于其前面一条产生标志位的运算指令,这不利于对中间指令的优化。因此,没有采用条件码标志位,而是使用显式的寄存器保存比较结果,在上面的例子中,CMP指令用v4保存了v1和v2的比较结果。
(4)将数据处理结果写回。
将数据运算结果写回时,分析源机器指令,用中间指令写回指令执行的结果,采用中间指令MOV v1,v2在前面已经介绍,语义是在虚拟寄存器之间移动数据,在这里将虚拟寄存器v1中的数据处理结果写回虚拟寄存器v2;采用中间指令ST v,sz,(v,imm)和FST fp,sz,(v,imm)将虚拟寄存器中的数据写回至内存。
ST v,sz,(v,imm) 将虚拟寄存器v中大小为sz的数据保存至内存地址v(imm)处。
FSTfp,sz,(v,imm)将源浮点寄存器寄存器fp中大小为sz的数据保存至内存地址v(imm)处。
(5)特殊指令
特殊指令完成一些特定二进制翻译系统的功能,包括中止运行(HALT)、系统调用(SYSCALL)以及函数调用(CALL)等。HALT指令终止运行;SYSCALL指令进行系统调用;CALLw1,w2,w3…调用入口地址为w1的函数,该函数带有w2个参数,分别为w3…。
HALT与SYSCALL指令分别由二进制翻译器前端通知后续部分解码过程中遇到特殊指令或特殊情况,需要中断当前翻译来处理。对于HALT翻译引擎可直接退出;对于SYSCALL则必须找到与源机器平台对应的系统调用处理函数。CALL指令用于调用一个C函数,这条指令是对中间指令集的重要补充。前面列出的指令不能方便映射到源机器程序中的某条生僻指令时,可以用一个C函数实现,这可以看作向软件解释器的退化,只要该源机器指令并不经常出现,可以用一个C函数专门负责解释执行该指令,不会带来性能的影响。
3、建立虚拟寄存器与目标机器寄存器的映射关系
定义虚拟寄存器的Next-Use是下一次使用该虚拟寄存器的中间指令在指令流中的位置。在建立虚拟寄存器与目标机器寄存器的映射关系时,采用基于Next-Use的寄存器分配方法:每条中间指令处都有一组虚拟寄存器Next-Use值,即这些虚拟寄存器在之后会被使用到,用寄存器Next-Use的二元组序列来表达这些虚拟寄存器。将虚拟寄存器分配到目标机器寄存器时,当目标机器寄存器数目大于等于源机器寄存器数目时,将所用到的虚拟寄存器一一对应到目标机器寄存器;当目标机器寄存器数目小于源机器寄存器数目且有空闲目标机器寄存器时,则将虚拟寄存器映射到空闲的目标机器寄存器;当目标机器寄存器数目小于源机器寄存器数目且没有空闲目标机器寄存器时,则将具有最大Next-Use虚拟寄存器所在的目标机器清空,将虚拟寄存器映射到具有最大Next-Use值的目地机器寄存器。具有最大的next-use的那个虚拟寄存器意味着最远会被再次用到,因此将其替换出去能保证该寄存器不会在很短时间内在内存和CPU物理寄存器间来回颠簸(Thrashing)。
4、将中间指令集翻译到目标机器指令集
对中间指令进行编码,生成目标机器二进制代码。由于中间指令集主要是各种源机器指令集中一些最常用的指令,因此在将中间指令翻译到机器指令时,大部分中间指令可直接映射到相应的目标机器指令;对于不能直接映射到机器指令的中间指令,可以用C函数实现。
下面以中间指令翻译到x86机器指令为例说明,x86具有丰富的指令的系统,易从中选取合适的指令来与中间指令对应。
以ADD r1,r2,r3中间指令为例,在不同的条件下,将对应不同的x86机器指令:
(r1=0)=>movl r2,r3
(r2=0)=>movl r1,r3
(r2=r3)=>addl r1,r3
(r1=r3)=>addl r2,r3
otherwise=>movl r1.r3
addl r2.r3
其中r1、r2、r3是经过寄存器分配后的x86物理寄存器。
又如BRANCH cc,r1,r2,(r3,disp)指令,x86采用先判断再跳转两条指令的方式进行分支跳转,并用条件码标志位保存判断结果:
cmp r1,r2
Jcc...
对于跳转指令如BRANCH、JMP来讲,跳转目标意味着一个新的代码块的开始,此时执行引擎必须重新获得控制权,进行一次新的“翻译一运行”迭代。因此上面的jcc指令应当使目标代码块从其执行流返回到执行引擎的入口,并把跳转目标(在上例中即r3+disp)传入其中。
CALL指令是一种特殊的中间指令集指令,跳转到一个C函数,执行完该函数后再返回调用处。由于跳转目标是一个C函数,其编译后的二进制代码满足x86/C的调用规范,包括esp寄存器指向栈顶,完整的栈帧(返回地址,从右向左压栈的输入参数等)。
5、将虚拟寄存器映射回源机器寄存器
用PUT v,s、FPUTS v,s、FPUTD v,s指令将虚拟寄存器映射至源机器寄存器,将中间指令对虚拟寄存器的改变对应到源机器指令对源机器寄存器的状态改变,从而建立虚拟寄存器到源机器寄存器的映射关系。
下面列出了本发明的虚拟寄存器到源寄存器的状态映射指令。
PU Tv,s将虚拟寄存器v映射至源整点寄存器s;
FPUTS v,s将虚拟寄存器v映射至源单精度浮点寄存器s;
FPUTD v,s将虚拟寄存器v映射至源双精度浮点寄存器s。
这三条中间指令将中间指令执行的结果写回源机器寄存器,以使源机器指令对源机器寄存器的修改能正确反映。
Claims (1)
1.一种利用中间指令集的二进制翻译方法,其特征在于包括如下步骤:
1)映射源机器寄存器到虚拟寄存器:定义中间指令集具有无穷多个32位寄存器,称虚拟寄存器,记作vn,其中v0永远代表零值;分析源机器指令中将要使用的源机器寄存器,通过寄存器状态映射指令GET s,v、FGETS s,v和FGETD s,v,将源机器寄存器映射至虚拟寄存器,将源机器指令对源机器寄存器的状态改变对应到中间指令对虚拟寄存器的改变,从而建立源机器寄存器到虚拟寄存器的映射关系;
2)将源机器指令翻译为中间指令:将最常用的源机器指令直接映射到某条中间指令,而对于不常用源机器指令则翻译成多条中间指令或者用C函数模拟,其中,加载数据至虚拟寄存器时,采用中间指令LD(v,imm),sz,v和FLD(v,imm),sz,fp将源机器指令中包含的内存数据加载至虚拟寄存器,采用中间指令LI imm,v将源机器指令中包含的立即数imm值赋给虚拟寄存器v,采用中间指令MOV v1,v2在虚拟寄存器之间移动数据;处理虚拟寄存器中的数据时,分析源机器指令所包含的运算操作,根据源机器指令语义用中间指令中的一条或几条运算指令将源机器指令的运算准确表达出来,采用算术计算指令完成算术运算,采用逻辑计算指令完成逻辑运算,采用移位运算指令完成移位操作,采用条件比较指令完成条件比较;控制中间指令的执行顺序时,分析源机器指令中所包含的跳转,用中间指令直接跳转JMP和分支跳转BRANCH来表示源机器指令的跳转;将数据运算结果写回时,分析源机器指令,用中间指令写回指令执行的结果,采用中间指令MOV v1,v2在虚拟寄存器之间移动数据,将结果写回虚拟寄存器,采用中间指令ST v,sz,(v,imm)和FST fp,sz,(v,imm)将虚拟寄存器中的数据写回至内存;采用特殊指令完成一些特定二进制翻译系统的功能,包括系统调用SYSCALL,中止运行HALT,函数调用CALL w1,w2,w3…;
3)建立虚拟寄存器与目标机器寄存器的映射关系:定义虚拟寄存器的Next-Use是下一次使用该虚拟寄存器的中间指令在指令流中的位置;当目标机器寄存器数目大于等于源机器寄存器数目时,将所用到的虚拟寄存器一一对应到目标机器寄存器;当目标机器寄存器数目小于源机器寄存器数目且有空闲目标机器寄存器时,则将虚拟寄存器映射到空闲的目标机器寄存器;当目标机器寄存器数目小于源机器寄存器数目且没有空闲目标机器寄存器时,则将虚拟寄存器映射到具有最大Next-Use值的目标机器寄存器;
4)将中间指令集映射到目标机器指令集:对中间指令进行编码,生成目标机器二进制代码,将中间指令集映射到目标机器指令;对于不能直接映射到机器指令的中间指令,用C函数实现;
5)将虚拟寄存器映射回源机器寄存器:用PUT v,s、FPUTS v,s、FPUTD v,s指令将虚拟寄存器映射至源机器寄存器,将中间指令对虚拟寄存器的改变对应到源机器指令对源机器寄存器的状态改变,从而建立虚拟寄存器到源机器寄存器的映射关系。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2007100476978A CN100462922C (zh) | 2007-11-01 | 2007-11-01 | 利用中间指令集的二进制翻译方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2007100476978A CN100462922C (zh) | 2007-11-01 | 2007-11-01 | 利用中间指令集的二进制翻译方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101145109A true CN101145109A (zh) | 2008-03-19 |
CN100462922C CN100462922C (zh) | 2009-02-18 |
Family
ID=39207649
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2007100476978A Expired - Fee Related CN100462922C (zh) | 2007-11-01 | 2007-11-01 | 利用中间指令集的二进制翻译方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100462922C (zh) |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101387969B (zh) * | 2008-10-16 | 2011-04-13 | 上海交通大学 | 软硬件协同设计的动态二进制翻译方法 |
CN101763242B (zh) * | 2010-01-04 | 2011-06-29 | 上海交通大学 | 二进制翻译中的字节序调整方法 |
CN102446112A (zh) * | 2010-10-12 | 2012-05-09 | 无锡江南计算技术研究所 | 指令处理装置和处理器、指令翻译装置和方法 |
CN102541611A (zh) * | 2010-12-21 | 2012-07-04 | 无锡江南计算技术研究所 | 指令翻译装置和方法、指令处理装置和处理器 |
CN101739238B (zh) * | 2010-01-14 | 2012-11-21 | 上海交通大学 | 针对sse2指令的二进制浮点翻译方法 |
CN102799461A (zh) * | 2011-05-24 | 2012-11-28 | 联想(北京)有限公司 | 一种应用的执行方法、装置及电子设备 |
CN101620546B (zh) * | 2009-08-13 | 2013-03-27 | 上海交通大学 | 寄存器窗口切换在二进制翻译中的实现方法 |
CN103235724A (zh) * | 2013-05-10 | 2013-08-07 | 中国人民解放军信息工程大学 | 基于原子操作语义描述的多源二进制代码一体化翻译方法 |
CN103365665A (zh) * | 2013-07-25 | 2013-10-23 | 成都品果科技有限公司 | 一种基于虚拟指令的应用程序移植方法 |
CN105446791A (zh) * | 2014-08-26 | 2016-03-30 | 龙芯中科技术有限公司 | 标志位模拟方法、装置和处理器 |
CN107408053A (zh) * | 2015-04-10 | 2017-11-28 | 谷歌公司 | 到本原客户端的二进制翻译 |
CN110352400A (zh) * | 2017-03-08 | 2019-10-18 | 华为技术有限公司 | 用于处理报文的方法和装置 |
CN112256331A (zh) * | 2020-12-22 | 2021-01-22 | 鹏城实验室 | 虚拟机指令解析加速方法、装置和计算机存储介质 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0570646A1 (en) * | 1992-05-18 | 1993-11-24 | Advanced Computer Research Institute S.A.R.L. | Method for processor simulation |
US6704925B1 (en) * | 1998-09-10 | 2004-03-09 | Vmware, Inc. | Dynamic binary translator with a system and method for updating and maintaining coherency of a translation cache |
CN1296815C (zh) * | 2003-10-21 | 2007-01-24 | 中国科学院计算技术研究所 | 二进制翻译中标志位的优化处理方法 |
CN1332308C (zh) * | 2004-09-10 | 2007-08-15 | 中国科学院计算技术研究所 | 一种动态二进制翻译中的翻译方法 |
-
2007
- 2007-11-01 CN CNB2007100476978A patent/CN100462922C/zh not_active Expired - Fee Related
Cited By (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101387969B (zh) * | 2008-10-16 | 2011-04-13 | 上海交通大学 | 软硬件协同设计的动态二进制翻译方法 |
CN101620546B (zh) * | 2009-08-13 | 2013-03-27 | 上海交通大学 | 寄存器窗口切换在二进制翻译中的实现方法 |
CN101763242B (zh) * | 2010-01-04 | 2011-06-29 | 上海交通大学 | 二进制翻译中的字节序调整方法 |
CN101739238B (zh) * | 2010-01-14 | 2012-11-21 | 上海交通大学 | 针对sse2指令的二进制浮点翻译方法 |
CN102446112A (zh) * | 2010-10-12 | 2012-05-09 | 无锡江南计算技术研究所 | 指令处理装置和处理器、指令翻译装置和方法 |
CN102446112B (zh) * | 2010-10-12 | 2015-05-20 | 无锡江南计算技术研究所 | 指令处理装置和处理器、指令翻译装置和方法 |
CN102541611A (zh) * | 2010-12-21 | 2012-07-04 | 无锡江南计算技术研究所 | 指令翻译装置和方法、指令处理装置和处理器 |
CN102541611B (zh) * | 2010-12-21 | 2014-09-03 | 无锡江南计算技术研究所 | 指令翻译装置和方法、指令处理装置和处理器 |
CN102799461B (zh) * | 2011-05-24 | 2015-09-23 | 联想(北京)有限公司 | 一种应用的执行方法、装置及电子设备 |
CN102799461A (zh) * | 2011-05-24 | 2012-11-28 | 联想(北京)有限公司 | 一种应用的执行方法、装置及电子设备 |
CN103235724A (zh) * | 2013-05-10 | 2013-08-07 | 中国人民解放军信息工程大学 | 基于原子操作语义描述的多源二进制代码一体化翻译方法 |
CN103365665A (zh) * | 2013-07-25 | 2013-10-23 | 成都品果科技有限公司 | 一种基于虚拟指令的应用程序移植方法 |
CN105446791A (zh) * | 2014-08-26 | 2016-03-30 | 龙芯中科技术有限公司 | 标志位模拟方法、装置和处理器 |
CN105446791B (zh) * | 2014-08-26 | 2018-11-20 | 龙芯中科技术有限公司 | 标志位模拟方法、装置和处理器 |
CN107408053A (zh) * | 2015-04-10 | 2017-11-28 | 谷歌公司 | 到本原客户端的二进制翻译 |
CN107408053B (zh) * | 2015-04-10 | 2021-04-16 | 谷歌有限责任公司 | 用于到本原客户端的二进制翻译的方法、系统和介质 |
CN110352400A (zh) * | 2017-03-08 | 2019-10-18 | 华为技术有限公司 | 用于处理报文的方法和装置 |
CN110352400B (zh) * | 2017-03-08 | 2021-05-04 | 华为技术有限公司 | 用于处理报文的方法和装置 |
CN112256331A (zh) * | 2020-12-22 | 2021-01-22 | 鹏城实验室 | 虚拟机指令解析加速方法、装置和计算机存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN100462922C (zh) | 2009-02-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100462922C (zh) | 利用中间指令集的二进制翻译方法 | |
CN101957743B (zh) | 并行数字信号处理器 | |
CN100555225C (zh) | 一种支持x86虚拟机的risc处理器装置及方法 | |
Richards | The portability of the BCPL compiler | |
CN103348323B (zh) | 用于在计算机系统中执行目标程序的方法和系统 | |
CN100378653C (zh) | 双算术逻辑单元精简指令集8位微控制器 | |
CN100357882C (zh) | 处理二进制编码的装置、系统和方法 | |
JP5717015B2 (ja) | アーキテクチャ・オプティマイザ | |
CN101652746A (zh) | 浮点操作的改善以及相关的改善 | |
CN102385524B (zh) | 一种基于混编指令集的编译链指令替换方法 | |
CN101021832A (zh) | 支持局部寄存和条件执行的64位浮点整数融合运算群 | |
CN101375248A (zh) | 硬件JavaTM字节码译码器 | |
CN103329097A (zh) | 工具生成器 | |
CN104246745A (zh) | 用于控制mxcsr的方法及装置 | |
CN103793208B (zh) | 矢量dsp处理器和协处理器协同运作的数据处理系统 | |
CN100428184C (zh) | 具有自驱动功能的指令仿真解析系统及其实现方法 | |
CN101211256A (zh) | 一种专用双流水线risc指令系统及其操作方法 | |
CN107729118A (zh) | 面向众核处理器的修改Java虚拟机的方法 | |
CN101866281B (zh) | 一种多周期指令执行方法和装置 | |
CN103270512A (zh) | 智能架构创建器 | |
CN101930356B (zh) | 用于浮点协处理器的寄存器文件分组编址、读写控制方法 | |
CN116775127A (zh) | 一种基于RetroWrite框架的静态符号执行插桩方法 | |
CN115328551A (zh) | 一种基于算子的微处理器架构设计方法及系统 | |
CN1661552B (zh) | 用于具有有限资源的微处理器的进程语言 | |
CN101907999B (zh) | 超长指令字程序的二进制翻译方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20090218 Termination date: 20161101 |