一种模拟器的生成方法及装置的制作方法

文档序号:6438820阅读:290来源:国知局
专利名称:一种模拟器的生成方法及装置的制作方法
技术领域
本发明涉及生成模拟器领域,尤其涉及一种模拟器的生成方法及装置。
背景技术
在设计一款芯片的同时,相应的软件也必须同时设计和实现,此时由于没有真实的芯片存在,所以必须有一种手段能够模拟真实芯片的动作,为软件的设计和调试提供环境。模拟器就是具备这种功能的软件。模拟器的基本原理是首先读入一段二进制的指令码流,通过解码器将其翻译成汇编指令,然后按照指令的定义模拟指令的动作,最终实现这段代码在目标芯片上的功能。现有的技术方案中,模拟器的一种生成方法是通过模拟器开发人员手工编写解码算法。这种方法的主要流程是1、人工分析指令集的编码格式,确定操作码涉及的位域。2、人工确定各个位域在解码算法中应用的先后顺序。3、人工确定每条指令在各个位域上对应的值。4、人工编写代码,按照上述位域的顺序,针对每个位域可能出现的值进行区分,如果可以确定操作码则返回操作码,否则进入下一个位域比较。现有的技术方案中,模拟器的另一种生成方法是通过模拟器开发人员手工分析指令集的编码格式,通过工具产生最终代码,这种方法称为半人工方法。这种方法的主要流程是1、人工分析指令集的编码格式,人工分割二进制指令的位域。2、人工确定各个位域在解码算法中应用的先后顺序。3、人工确定每条指令在各个位域上对应的值。4、通过工具产生代码。在实现上述模拟器的生成方法的过程中,发明人发现现有技术中至少存在如下问题首先,人工分析和编写代码的工作量很大,且容易出错,后期测试代价高;其次,人工分析和编写代码工期长;再次,通常模拟器的开发是和芯片设计同步进行的,即指令集及其编码格式还没有最终确定时模拟器就要投入开发和应用,这就意味着模拟器的解码算法是可能随时更改的,并且要求能够迅速完成这个更改并投入使用。人工方法或是半人工方法无法适应这种要求。基于这些问题,模拟器无法实现快速移植,不具有高效性。

发明内容
本发明的实施例提供一种模拟器的生成方法及装置,用于实现模拟器的快速移植性和高效性。为达到上述目的,本发明的实施例采用如下技术方案
一种模拟器的生成方法,包括获取指令集配置文件;根据所述指令集配置文件生成解码表和解码算法;所述解码表包括指令码表,指令描述表和位域表;其中,所述指令码表中记录有汇编指令操作码,所述指令描述表记录有每条汇编指令操作码的详细信息,所述位域表记录有计算每一个操作数位域上的数值的方法;根据所述解码表、所述解码算法和模块代码生成模拟器; 所述模块代码是用于模拟汇编指令的动作的代码和解码过程中非解码算法的代码。一种模拟器的生成装置,包括获取单元,用于获取指令集配置文件;解释器,用于根据所述指令集配置文件生成解码表和解码算法;所述解码表包括指令码表,指令描述表和位域表;其中,所述指令码表中记录有汇编指令操作码,所述指令描述表记录有每条汇编指令操作码的详细信息,所述位域表记录有计算每一个操作数位域上的数值的方法;编译器,用于根据所述解码表、所述解码算法和模块代码生成模拟器;所述模块代码是用于模拟汇编指令的动作的代码和解码过程中非解码算法的代码。本发明实施例提供了一种模拟器的生成方法及装置,首先获取指令集配置文件, 然后,根据指令集配置文件生成解码表和解码算法,最后,在根据解码表,解码算法和模块代码生成模拟器。这种生成模拟器的方法及装置不需要人工分析,还可以利用查找解码表的方法来定位,保证了模拟器的可移植性和高效性。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为本发明实施例提供的一种模拟器的生成方法的流程图;图2为图1中生成解码表的流程图;图3为图1中生成解码算法的流程图;图4为本发明实施例提供的一种模拟器的生成方法的解码算法解析图;图5为本发明实施例提供的一种模拟器的生成方法的解码算法一种流程图;图6为本发明实施例提供的一种模拟器的生成方法的解码算法的又一解析图;图7为本发明实施例提供的一种模拟器的生成方法的解码算法又一种流程图;图8为本发明实施例提供的一种模拟器的生成装置的一种示意图;图9为本发明实施例提供的一种模拟器的生成装置的又一种示意图。
具体实施例方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。本发明实施例提供了一种模拟器的生成方法,该生成方法各步骤的执行主体为一种模拟器的生成装置,例如,该生成装置可以为计算机等。所述生成方法,如图1所示,包括以下步骤101、获取指令集配置文件;指令集配置文件包括芯片上所有指令集的名字及其位域,所有操作数的类型及其输出方式,以及每一指令的汇编输出格式、操作数类型及编码格式;所述指令包括操作数和操作码。其中,芯片开发人员提供开发芯片所使用的所有指令集,其中,每一指令集为指令的集合。模拟器开发人员根据芯片开发人员提供的指令集完成指令集配置文件的填写,此过程是不需要模拟器开发人员人工分析的;具体的,可以由模拟器开发人员将芯片开发人员提供的指令集复制到一网页中,查看该网页的脚本,并由模拟器开发人员根据网页的脚本按照指令集配置文件的格式填写指令集配置文件。在本发明实施例中提供一具体的实例,以说明指令集配置文件的格式。例如,
/*所有指令集的名字*/
<insn_types>={X64, X64 SE0, X64 SE1, X24, X16}
/*各个指令集的位域*/
<X64>={0,63}
<X64_SE0 >={28, 47}
<X64_SE1>={48, 63}
<X24>={0, 23}
<X16>={0, 15}
/*所有操作数的类型*/
<opend_types>={reg, vreg, breg, immg, imml6, imm}
/*操作数的输出方式*/
<reg>={a%i, 0"31}
<vreg>={v%i, 0"15}
<breg>={b%i, 0"15}
<imm8>={ %i, 0"255}
<imml6>={ %i, 0"65535}
<imm>={%i}{ABS20/*具体指令*/
{ABS20 $1, $2}/*指令的汇编输出格式*/
{vreg, vreg}/*操作数类型*/
/*以下是指令ABS20所有可能的编码格式*/
{X64 SE0/*指令 ABS20 在指令集 X64_SE0 中 */
{00000110********0001****} /* 操作码的编码格式 */ {**__4_3210**__} /*操作数$1的编码格式*/ {**___4**__3210} /*操作数$2的编码格式*/
}
{X24/*指令ABS20在指令集X24中*/
{0110********0001****0000} /* 操作码的编码格式 */ {****4***3210************} /* 操作数 $1 的编码格式 */ {*__4*_*_3210*_} /*操作数$2的编码格式*/
}
}上述实例是一个指令集配置文件的一部分。其中,所有指令集的名字是指芯片所使用的所有指令集的名字。一个SoC芯片可以包括多个异构处理器,每一个处理器可以包括多种指令集。比如上述指令集配置文件的例子中,XM和X16就是同一个处理器上的两个不同的指令集。指令集名字也可以反映 VLIff(Very Long Instruction Word,超长指令字)指令集和其中普通指令集的关系,比如 X64是一种VLIW指令集,它包括两种普通指令集,即)(64_SE0和)(64_SE1。所述各个指令集的位域描述各个指令集占据的比特区间,例如,<X64> = {0,63} 描述该类型指令集X64占据64比特,从0到第63位。<X64_SE0> = {28,47}说明X64_SE0 指令集占据其所在的X64指令集的第28到第47位。所述所有操作数类型一项列出了芯片中所有可能的操作数类型。所述操作数的输出方式描述每个操作数汇编输出格式,以及允许的取值范围。另外,{ABS20. . . }语句是每条指令的具体描述,上述指令集配置文件的例子中以一个指令ABS20为例进行说明。在每个指令的具体描述中,包括以下部分(1)指令的汇编输出格式;(2)指令中各个操作数的类型;(3)所有可能的编码格式;其中,指令包括操作数和操作码,所述编码格式包括操作码编码格式和操作数编码格式。对于操作码编码格式中用数字表示的比特位为该操作码的相关比特位,用“*”表示的比特位为该操作码的无关比特位,其中,操作码的相关比特位上的编码是实际的值。对于操作数编码格式中用数字表示的比特位为该操作数的相关比特位,用“*”表示的比特位为该操作数的无关比特位,其中,操作数的相关比特位上的编码描述了由哪些比特位构成当前操作数以及每个比特位在该操作数中的权重。如在)(64_SE0指令集中,ABS20的第一个操作数(即目的操作数)由5 个比特构成,第四位在指令的第15位,第0到第3位对应了指令的第8位到第11位。假设
8ABS20指令的二进制数为bin,如果要解析一条二进制的ABS20指令的第一个操作数,计算方法为value_of_rsl = ((bin >> 15)&0xl) << 4+((bin >> 8)&0xF);其文字描述具体为二进制数bin整体先右移15位,在与十六进制数1(即二进制数0001)进行与运算, 然后再将得到的数左移4位,得到第一个操作数的第4位数,然后将原二进制数bin先右移 8位,在与十六进制数F(即二进制数1111)进行与运算,得到第一个操作数的第0位到第3 位数,最后,将第4位数与第0位到第3位数进行或运算,得到第一个操作数,即为目的操作数。需要说明的是,位域是指令的编码格式中一段连续的比特位。在本发明所有实施例中,操作码位域是指对于指令集配置文件中的指令操作码的编码格式中一段连续的相关比特位,其中,一个指令操作码包括至少一个操作码位域;同样的,操作数位域是指指令集配置文件中指令操作数的编码格式中一段连续的相关比特位,其中,一个指令的操作数包括至少一个操作数位域。另外,需要说明的是,在同一指令集配置文件中,一条指令在一个指令集中或者在至少两个不同的指令集中;也就是说,一条指令有可能在不同的指令集中都出现,编码格式也可能不同,比如ABS20指令可以出现在)(64_SE0和XM两种指令集中,两者的编码格式也不同。102、根据指令集配置文件生成解码表和解码算法;解码表包括指令码表,指令描述表和位域表。其中,所述指令码表中记录有汇编指令操作码,所述指令描述表记录有每条汇编指令操作码的详细信息,所述位域表记录有计算每一个操作数位域上的数值的方法。下面,对根据指令集配置文件生成解码表的过程做具体描述,如图2所示,包括1021、根据每一指令操作码生成指令码表,优选的,根据每一指令集中对应的指令操作码位域和各操作码位域的值生成具有层次的指令码表。具体的,指令码表用于识别一个二进制数代表的指令。如图4所示,每个指令码表可以包括三项内容,一是“操作码位域的值”;二是“类型”,类型“Next Table”表示需要查找下一个指令码表,类型“Instruction”表示已经在当前指令码表中查找到该操作码对应的指令;三是“类型值”,即类型对应的值;类型“Next Table”所对应的类型值为下一个指令码表的名称,类型“Instruction”所对应的值为查找到的指令。由于每个指令集最终会产生多个指令码表,每个指令码表对应一个位域,所以根据每一指令操作码位域和各操作码位域的值生成具有层次关系的指令码表;上述用类型“Next Table”所联系在一起的指令码表即为所述具有层次关系的指令码表。其中指令码表1记录的操作码位域是[16,23]bits, 指令码表2记录的操作码位域是W,7]bits。具有层次关系的指令码表可以按照需要查找的先后顺序定义层次的高低;例如,对于上述指令集配置文件中指令ABS20在指令集)(64_ SEO中的编码格式而言,需要查找的最高层次的指令码表为指令码表1,由指令码表1可以找到下一指令码表(次高层次的指令码表),即指令码表2。1022、根据每一指令的汇编输出格式、操作数类型及编码格式生成指令描述表。具体的,如图4所示,指令描述表用于记录每条汇编指令操作码的详细信息,包括(1)指令格式,即每个操作数的类型,例如,若一条指令的两个操作数类型都是寄存器类型,则用RR表示;若一条指令的一个操作数类型是寄存器类型,一个操作数类型是内存地址类型,则用RM表示。在图4中,指令描述表中的指令的操作数类型都是寄存器类型,即 RR型。(2)每个目的或源操作数的位域,(3)指令的模拟函数的入口地址,⑷汇编输出格式;所以根据每一指令的汇编输出格式、操作数类型及编码格式能够生成指令描述表。一条汇编指令操作码的所有相关信息在指令描述表中的位置(即一条汇编指令操作码的相关信息在指令描述表中的第几行)和该汇编指令操作码一一对应,例如参考图4,指令ABS20 的汇编指令操作码的所有相关信息的位置(即指令描述表中的第一行)与该指令ABS20的汇编指令操作码相对应。这样就使得可以从指令码表中得到需要查找的汇编指令操作码, 通过该汇编指令操作码可以在指令描述表中找到与其相对应的该汇编指令操作码相关信息的位置,进而读取到该汇编指令操作码的相关信息。1023、根据每一指令的操作数生成位域表。具体的,如图4所示,位域表记录如何计算一个操作数位域上的数值,包括操作数位域计算方法标识和操作数位域的值的计算方法;所以根据每一指令的操作数能够生成位域表。解码算法包括获取汇编指令操作码算法、获取汇编指令操作码相关信息算法和获取汇编指令操作数算法三部分;下面,对根据指令集配置文件生成解码算法的过程做具体描述,如图3所示,包括1024、按照由指令集配置文件生成指令码表的规则,生成用于在指令码表中查找二进制指令操作码对应的汇编指令操作码的解码算法的获取汇编指令操作码算法。其中,规则就是按照上述指令码表的格式将每个指令集的中的所有指令写进相应的指令码表,且指令码表间具有层次关系。根据这个由指令集配置文件生成指令码表规则, 生成通过查找指令码表将二进制指令操作码转化为汇编指令操作码的解码算法的获取汇编指令操作码算法。优选的,解码表还包括与所述指令码表之间存在索引关系的间接索引表。按照由指令集配置文件生成指令码表和间接索引表的规则,以及指令码表和间接索引表之间的索引关系,生成用于在所述指令码表中查找二进制指令操作码对应的汇编指令操作码的解码算法的获取汇编指令操作码算法。具体的,间接索引表存储用于索引所述指令码表的索引值;每一个指令码表都有一个对应的间接索引表。指令码表和间接索引表之间的索引关系是,在确定二进制指令所属的指令集后,取出二进制指令操作码,并根据指令集的第一个间接索引表的位域计算出二进制指令操作码的位域值,根据此位域值查找第一个间接索引表,找到匹配的索引项,取出索引值,并用此索引值索引指令码表,得到汇编指令操作码或者得到下一指令码表在进行查找,直至找到汇编指令操作码。所以,根据指令集配置文件生成指令码表和间接索引表的规则,以及指令码表和间接索引表之间的索引关系,生成通过查找指令码表将二进制指令操作码转化为汇编指令操作码的解码算法的获取汇编指令操作码算法。1025、按照由指令集配置文件生成指令描述表的规则以及指令码表和指令描述表之间的索引关系,生成用于根据汇编指令操作码索引指令描述表并在索引到的指令描述表中读取汇编指令操作码的相关信息的解码算法的获取汇编指令操作码相关信息算法。具体的,指令码表和指令描述表间的索引关系是,一条二进制指令操作码通过查找指令码表找到相应的汇编指令操作码,通过此汇编指令操作码查找指令描述表,找到此汇编指令操作码的相关信息。根据指令集配置文件生成指令描述表的规则以及指令码表和指令描述表间的索引关系,生成获取二进制指令操作码所对应的汇编指令操作码相关信息的解码算法的获取汇编指令操作码相关信息算法。1026、按照由指令集配置文件生成位域表的规则,以及指令描述表和位域表之间的索引关系,生成用于根据汇编指令操作码的相关信息索引位域表并根据索引到的位域表计算出汇编指令操作数的解码算法的获取汇编指令操作数算法。具体的,指令描述表和位域表之间的索引关系是,上述二进制指令通过指令码表找到相应汇编指令操作码,并通过指令描述表得到汇编指令操作码相关信息,通过此相关信息记录的汇编指令操作数信息查找位域表,并在位域表中查找到计算汇编指令操作数的方法。所以,根据由指令集配置文件生成位域表的规则以及指令描述表和位域表之间的索引关系,生成用于获取汇编指令操作数的解码算法的获取汇编指令操作数算法。103、根据解码表、解码算法和模块代码生成模拟器;所述模块代码是用于模拟汇编指令的动作的代码和解码过程中非解码算法的代码。其中,将解码表,解码算法和模块代码经过编译连接生成模拟器。需要说明的是,在二进制的指令流码解码为汇编指令后,将进一步执行模拟此汇编指令的动作的代码;模块代码就是模拟此汇编指令的动作的代码和解码过程中非解码算法的代码。模拟器的生成方法中的解码算法可以使用直接查找法,或者间接索引法。对于一个二进制指令而言,若模拟器使用解码算法的直接查找法将二进制指令解码成汇编指令,如图5所示,该解码过程具体步骤包括301、根据所述二进制指令的前四位代码确定所述二进制指令所属的指令集,然后根据此指令集确定需要查找的指令码表,查找指令码表,直至查找到二进制指令操作码对应的汇编指令操作码。具体的,第一次用到的指令码表是最高层次的指令码表,每个指令集只有一个最高层次的指令码表;例如,图4中的指令码表1为最高层次的指令码表。此步骤可以包括首先,根据二进制指令的前四位代码确定二进制指令所属的指令集,并查找指令集对应的最高层次的指令码表。其次,按照最高层次的指令码表对应的操作码位域,从需要查找二进制指令操作码编码中取出该操作码位域对应的值,将取出的该操作码位域对应的值逐一匹配最高层次的指令码表中的第一项内容(即“操作码位域的值”),直到找到匹配的表项。在本发明实施例中表项是指一个表中除表头之外所记录的一项内容,例如图5中的指令码表1 ψ "ObOOOOO 110"为一个表项,Instruction”也为一个表项。然后,查看此表项对应的第二项内容(即“类型”)和第三项内容(即“类型值”);若此表项对应的类型是Next Table (下一个表),则该表项对应的类型值是下一个层次指令码表的标识,并可以按照该下一个层次指令码表的标识继续查找直至确定最终的一个指令码表,并在最终的一个指令码表中查找到指令;若此匹配的表项对应的类型是 Instruction (指令操作码),则当前查找的指令码表为最终的一个指令码表,且该匹配的表项对应的类型值是指令操作码,此指令操作码便是要查找的汇编指令操作码。例如,在本发明实施例中指令ABS20的二进制代码的前四位表明指令ABS20属于指令集X64_SE0,且在指令集X64_SE0中的操作码编码格式“000001” 查找到该编码对应的指令,则首先,识别出该编码中的操作码位域,即[16,23]bits和W, 7]bits,按照预设的规则确定指令码表1为最高层次的指令码表,此处,预设的规则即形成具有层次的指令码表的层次关系时所利用的规则,例如在本发明实施例中[16,23] bits的指令码表(指令码表1)作为高层次的指令码表,[4,7]bits的指令码表(指令码表2)作为低层次的指令码表。其次,从“00000110*###*0001*#*”中取出[16,23] bits的值为“ObOOOOOllO”,其中Ob为二进制的标识,并将取出的[16,23]bits的值逐一匹配指令码表1中的“操作码位域的值”,直到找到匹配的表项。然后,查看该表项对应的“类型”为Next Table, “类型值”为Tbl_X64_SE0_l (即指令码表2的标识);继续从 “00000110林###0001##”中取出[4,7]bits 的值为 “ObOOOl ”,并将取出的[4,7]bits 的值逐一匹配指令码表2中的“操作码位域的值”直到,找到匹配的表项,并查看该匹配的表项对应的“类型”为Instruction,“类型值”为ABS20-1,从而得到ABS20-1即为需要查找的指令ABS20的汇编指令操作码。302、根据所述汇编指令操作码索引该汇编指令操作码相关的指令描述表,读取所述汇编指令操作码的所有相关信息。由于一条汇编指令操作码与此汇编指令操作码的所有相关信息在指令描述表中的位置一一对应,故使得可以通过该汇编指令操作码在指令描述表中查找到此汇编指令操作码的所有相关信息的位置,以便可读取汇编指令操作码的所有相关信息;故针对上一具体例子,查找到指令ABS20的汇编指令操作码为ABS20-1,即找到汇编指令操作码ABS20-1 的所有相关信息在指令描述表的第一行,并读取ABS20-1的所有相关信息。303、根据所读取到的相关信息索引该汇编指令操作码相关的位域表,并根据所述位域表计算出操作数。具体的,读取的指令描述表的操作数位域信息即为位域表中的操作数位域计算方法标识,在位域表中,可根据此操作数位域计算方法标识查找到操作数位域的计算方法,并根据此计算方法计算出操作数。在上述具体例子中,读取的指令描述表的目的操作数位域信息为BITFLD_x,查找位域表的操作数位域计算方法标识为BITFLD_x的表项,并通过此表项对应的计算方法 ((bin >> 15)&0xl) << 4+((bin >> 8)0xF)计算出目的操作数。读取指令码表的第一源操作数位域信息为BITFLD_y,查找位域表的操作数位域计算方法标识为BITFLD_y的表项,并通过此表项对应的计算方法((bin >> ll)&0xl) << 4+(bin&0xF)计算出第一源操作数。通过上述直接查找解码算法,可以通过查表的方法来定位读入的二进制流码所对应的汇编指令,提高了模拟器的速度,保证了模拟器的高效性和可移植性。进一步的,解码表还包括间接索引表。其中,间接索引表存储用于索引所述指令码表的索引值;每一个指令码表都有一个对应的间接索引表。具体的,如图6所示,每个间接索引表可以包括两项内容,一是“操作码位域所有可能的值” ;二是“索引值”;索引值可以是数字,根据此索引值可以查找指令码表的相应位置,得到索引值对应的指令码表的具体信息;还可以是空值,表示并不指向指令码表。例如, 对于上述指令ABS20的二进制代码的前四位表明指令ABS20属于指令集)(64_SE0,对于指令ABS20在指令集)(64_SE0中的编码格式而言,指令码表1对应间接索引表1,在间接索引表 1中列出了指令码表1所对应的操作码位域的所有可能的值,转化为十进制数即0 255 ; 并列出了 0 255所对应的所有索引值。在间接索引表1中,操作码位域值6对应的索引值为1,可根据此索引值1查找指令码表1的相应位置,并得到索引值1所对应的具指令码表1的具体信息;其余操作码位域的值对应的索引值都为空值,表示并不指向指令码表1。对于一条二进制指令而言,优选的,若模拟器使用解码算法的间接索引法将二进制指令解码成汇编指令。如图7所示,该解码过程具体步骤包括501、根据二进制指令的前四位代码确定二进制指令所属的指令集,然后根据此指令集确定需要查找的第一个间接索引表,并查找第一个间接索引表得到二进制指令操作码相应位域的索引值。具体的,最高层次的指令码表所对应的间接索引表是第一个间接索引表;如图6 中的间接索引表1为第一个间接索引表。若是第一次查找,此步骤可以包括首先,根据二进制指令前四位代码确定二进制指令所属的指令集,并根据此指令集确定最高层次的指令码表并根据指令码表确定需要查找的间接索引表。其次,按照最高层次的指令码表对应的操作码位域,从需要查找二进制指令操作码编码中取出该操作码位域的值,并将其转化为十进制的数,根据此十进制数查找第一个间接索引表,找到索引值。例如,在本发明实施例中确定指令ABS20的二进制代码的前四位所属的指令集为 X64_SE0,并在指令集X64_SE0中的操作码编码格式“00000110####0001##”查找到该编码对应的指令,则首先,识别该处编码中的操作码位域,即[16,23]bits和W,7]bits, 按照预设的规则确定指令码表1为最高层次的指令码表,并根据指令码表1找到对应的间接索引表1,此处,预设的规则即形成具有层次的指令码表的层次关系时所利用的规则。例如在本发明实施例中[16,23]bits的指令码表(指令码表1)作为高层次的指令码表,并找到最高层次的指令码表(指令码表1)对应的间接索引表(间接索引表l),[4,7]bits的指令码表(指令码表幻作为低层次的指令码表,并根据低层次的指令码表(指令码表幻找到对应的间接索引表(间接索引表幻。其次,从“00000110********0001****”中取出[16, 23]bits的值为“ObOOOOOllO”,其中Ob为二进制的标识,将其转化为十进制数为6,并根据十进制数6查找间接索引表1,得到6所对应的索引值为1。502、根据所述索引值进行至少一次索引得到含有二进制指令操作码对应的汇编指令操作码的指令码表,并在该指令码表中获取二进制指令操作码对应的汇编指令操作码的。具体的,根据在第一个间接索引表中找到的索引值查找第一个间接索引表对应的指令码表,得到索引值对应的指令码表的具体信息;查看指令码表的内容,“类型”表项和 “类型值”表项;若“类型”表项的内容是Next Table(下一个表),则“类型值”表项的内容是下个一层次指令码表的标识,并可以按照该下一个层次指令码表的标识继续查找直至确定最终的一个指令码表,并在最终的一个指令码表中查找到指令;若“类型”表项的内容是 hstruction (指令操作码),则当前查找的指令码表为最终的一个指令码表,且“类型值” 表项是指令操作码,此指令操作码便是要查找的汇编指令操作码。需要说明的是,在间接索引的解码算法中,每个指令码表只有两项内容,一是“类型”,二是“类型值”。例如,在本发明实施例中需要根据上述ABS20指令的最高层次的指令码表对应的操作码位域值对应的索引值查找到该编码对应的汇编指令操作码,首先根据得到的索引值 1查找对应的指令码表1,得到该索引值1对应的指令码表1的具体信息;然后,查看该指令码表的两项内容,“类型”表项的内容为Next Table,“类型值”表项的内容为Tbl_X64_ SE0_1 (即指令码表2的标识);继续从“00000110####0001##”中取出W,7]bits的值为“ObOOOl”,并将取出的W,7]bits的值转化为十进制数1,根据此十进制数1查找指令码表2对应的间接索引表2,得到操作码位域的值1所对应的索引值为1 ;根据得到的索引值1查找指令码表2,得到索引值1所对应的指令码表2的具体信息,查看指令码的两项内容,“类型”表项的内容为hstruction,“类型值”表项为ABS20-1,从而得到ABS20-1即为需要查找的汇编指令操作码。503、根据所述汇编指令操作码索引指令描述表,读取所述汇编指令操作码的所有
相关信息。由于一条汇编指令操作码与此汇编指令操作码的所有相关信息在指令描述表中的位置一一对应,故使得可以通过该汇编指令操作码在指令描述表中查找到此汇编指令操作码的所有相关信息的位置,以便可读取汇编指令操作码的所有相关信息;故针对上一具体例子,查找到指令ABS20的汇编指令操作码为ABS20-1,即找到汇编指令操作码ABS20-1 的所有相关信息在指令描述表的第一行,并读取ABS20-1的所有相关信息。504、根据所述指令描述表读取所述位域表,并根据所述位域表计算出每个操作数。具体的,读取的指令描述表的操作数位域信息即为位域表中的操作数位域计算方法标识,在位域表中,可根据此操作数位域计算方法标识查找到操作数位域的计算方法,并根据此计算方法计算出操作数。通过上述间接索引的解码算法,可以通过查表的方法来定位读入的二进制流码所对应的汇编指令,节省了内存空间,提高了模拟器的速度,保证了模拟器的高效性和可移植性。本发明实施例提供了一种模拟器的生成方法。首先获取指令集配置文件,然后,根据指令集配置文件生成解码表和解码算法,最后,在根据解码表,解码算法和模块代码生成模拟器。这种生成模拟器的方法不需要人工分析,还可以利用查找解码表的方法来定位,保证了模拟器的可移植性和高效性。本发明实施例提供了一种模拟器的生成装置,如图8所示,包括获取单元601,解释器602和编译器603 ;获取单元601,用于获取指令集配置文件;指令集配置文件包括芯片上所有指令集的名字及其位域,所有操作数的类型及其输出方式,以及每一指令的汇编输出格式、操作数类型及编码格式;指令包括操作数和操作码。其中,芯片开发人员提供开发芯片所使用的所有指令集,其中,每一指令集为指令的集合。模拟器开发人员根据芯片开发人员提供的指令集完成指令集配置文件的填写,此过程是不需要模拟器开发人员人工分析的;具体的,可以由模拟器开发人员将芯片开发人员提供的指令集复制到一网页中,查看该网页的脚本,并由模拟器开发人员根据网页的脚本按照指令集配置文件的格式填写指令集配置文件。需要说明的是,在获取单元601的同一指令集配置文件中,一条指令在一个指令集中或者在至少两个不同的指令集中;也就是说,一条指令有可能在不同的指令集中都出现,编码格式也可能不同,提高了模拟器的高效性。解释器602,用于根据所述指令集配置文件生成解码表和解码算法;解码表包括 指令码表,指令描述表和位域表;其中,所述指令码表中记录有汇编指令操作码;指令描述表用于记录每条汇编指令操作码的详细信息;位域表用于记录有计算每一个操作数位域上的数值的方法。进一步的,解释器中用于根据指令集配置文件生成解码表,如图9所示,包括生成指令码表模块6021,用于根据每一指令操作码生成指令码表;优选的,根据每一指令操作码位域和各操作码位域的值生成具有层次的指令码表。具体的,指令码表用于识别一个二进制数代表的指令。每个指令码表可以包括三项内容,一是“操作码位域的值”;二是“类型”,类型“Next Table”表示需要查找下一个指令码表,类型“Instruction”表示已经在当前指令码表中查找到该操作码对应的汇编指令操作码;三是“类型值”,即类型对应的值;类型“Next Table”所对应的类型值为下一个指令码表的名称,类型“Instruction”所对应的值为查找到的汇编指令操作码。由于每个指令集最终会产生多个指令码表,每个指令码表对应一个位域,所以根据每一指令操作码位域和各操作码位域的值生成具有层次关系的指令码表;上述用类型“Next Table”所联系在一起的指令码表即为所述具有层次关系的指令码表。生成指令描述表模块6022,用于根据每一指令的汇编输出格式、操作数类型及编码格式生成指令描述表。具体的,指令描述表用于记录每条指令的详细信息,包括(1)指令格式,即每个操作数的类型,例如,若一条指令的两个操作数类型都是寄存器类型,则用RR表示;若一条指令的一个操作数类型是寄存器类型,一个操作数类型是内存地址类型,则用RM表示。(2) 每个目的或源操作数的位域,( 指令的模拟函数的入口地址,(4)汇编输出格式;所以根据每一指令的汇编输出格式、操作数类型及编码格式能够生成指令描述表。生成位域表模块6023,用于根据每一指令的操作数生成位域表。具体的,位域表记录如何计算一个操作数位域上的数值,包括操作数位域计算方法标识和操作数位域的值的计算方法;所以根据每一指令的操作数能够生成位域表。获取汇编指令操作码算法模块60M,用于按照由指令集配置文件生成指令码表的规则按照由指令集配置文件生成指令码表的规则,生成用于在指令码表中查找二进制指令操作码对应的汇编指令操作码的解码算法的获取汇编指令操作码算法。优选的,解码表还包括与所述指令码表之间存在索引关系的间接索引表;获取汇编指令操作码算法模块60M,用于按照由指令集配置文件生成指令码表和间接索引表的规则,以及指令码表和间接索引表之间的索引关系,生成用于在指令码表中查找二进制指令操作码对应的汇编指令操作码的解码算法的获取汇编指令操作码算法。获取汇编指令操作码相关信息算法模块6025,用于按照由指令集配置文件生成指令描述表的规则以及指令码表和指令描述表之间的索引关系,生成用于根据汇编指令操作码索引指令描述表并在索引到的指令描述表中读取汇编指令操作码的相关信息的解码算法的获取汇编指令操作码相关信息算法。获取汇编指令操作数算法模块60 ,用于按照由指令集配置文件生成位域表的规贝U,以及指令描述表和位域表之间的索引关系,生成用于根据汇编指令操作码的相关信息索引位域表并根据索引到的位域表计算出汇编指令操作数的解码算法的获取汇编指令操作数算法。进一步的,解释器中的解码算法包括直接查找法和间接索引法;优选的,解码算法为间接索引法。编译器603,用于根据解码表、所述解码算法和模块代码生成模拟器;所述模块代码是用于模拟汇编指令的动作的代码和解码过程中非解码算法的代码。其中,将解码表,解码算法和模块代码经过编译连接生成模拟器。需要说明的是,在二进制的指令流码解码为汇编指令后,将进一步执行模拟此汇编指令的动作的代码;模块代码就是模拟此汇编指令的动作的代码和解码过程中非解码算法的代码。本发明实施例提供了一种模拟器的生成装置。首先,获取单元获取指令集配置文件,然后,解释器根据获取单元的指令集配置文件生成解码表和解码算法,最后,编译器根据解释器生成的解码表,解码算法和模块代码经编译连接生成模拟器。这种生成模拟器的装置不需要人工分析,还可以利用查找解码表的方法来定位,保证了模拟器的可移植性和高效性。以上所述,仅为本发明的具体实施方式
,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
权利要求
1.一种模拟器的生成方法,其特征在于,包括获取指令集配置文件;根据所述指令集配置文件生成解码表和解码算法;所述解码表包括指令码表,指令描述表和位域表;其中,所述指令码表中记录有汇编指令操作码,所述指令描述表记录有每条汇编指令操作码的详细信息,所述位域表记录有计算每一个操作数位域上的数值的方法;根据所述解码表、所述解码算法和模块代码生成模拟器;所述模块代码是用于模拟汇编指令的动作的代码和解码过程中非解码算法的代码。
2.根据权利要求1所述的模拟器的生成方法,其特征在于,所述指令集配置文件包括每一指令的汇编输出格式、操作数类型及编码格式;所述指令包括操作数和操作码;所述根据所述指令集配置文件生成解码表包括根据所述每一指令操作码生成指令码表;根据所述每一指令的汇编输出格式、操作数类型及编码格式生成指令描述表;根据所述每一指令的操作数生成位域表。
3.根据权利要求2所述的模拟器的生成方法,其特征在于,所述根据每一指令操作码生成指令码表具体为根据每一指令操作码位域和各操作码位域的值生成具有层次的指令码表。
4.根据权利要求2或3所述的模拟器的生成方法,其特征在于,所述解码算法包括获取汇编指令操作码算法、获取汇编指令操作码相关信息算法和获取汇编指令操作数算法三部分;所述根据所述指令集配置文件生成解码算法具体包括按照由所述指令集配置文件生成所述指令码表的规则,生成用于在所述指令码表中查找二进制指令操作码对应的汇编指令操作码的解码算法的获取汇编指令操作码算法;按照由所述指令集配置文件生成所述指令描述表的规则以及所述指令码表和所述指令描述表之间的索引关系,生成用于根据所述汇编指令操作码索引所述指令描述表并在索引到的指令描述表中读取汇编指令操作码的相关信息的解码算法的获取汇编指令操作码相关信息算法;按照由所述指令集配置文件生成所述位域表的规则,以及所述指令描述表和所述位域表之间的索引关系,生成用于根据所述汇编指令操作码的相关信息索引位域表并根据索引到的位域表计算出汇编指令操作数的解码算法的获取汇编指令操作数算法。
5.根据权利要求4所述的模拟器的生成方法,其特征在于,所述解码表还包括与所述指令码表之间存在索引关系的间接索引表;所述按照由所述指令集配置文件生成所述指令码表的规则,生成用于在所述指令码表中查找二进制指令操作码对应的汇编指令操作码的解码算法的获取汇编指令操作码算法包括按照由所述指令集配置文件生成所述指令码表和间接索引表的规则,以及所述指令码表和所述间接索引表之间的索引关系,生成用于在所述指令码表中查找二进制指令操作码对应的汇编指令操作码的解码算法的获取汇编指令操作码算法。
6.根据权利要求1 5任一项所述的模拟器的生成方法,其特征在于,在同一指令集配置文件中,一条指令在一个指令集中或者在至少两个不同的指令集中。
7.一种模拟器的生成装置,其特征在于,包括获取单元,用于获取指令集配置文件;解释器,用于根据所述指令集配置文件生成解码表和解码算法;所述解码表包括指令码表,指令描述表和位域表;其中,所述指令码表中记录有汇编指令操作码,所述指令描述表记录有每条汇编指令操作码的详细信息,所述位域表记录有计算每一个操作数位域上的数值的方法;编译器,用于根据所述解码表、所述解码算法和模块代码生成模拟器;所述模块代码是用于模拟汇编指令的动作的代码和解码过程中非解码算法的代码。
8.根据权利要求7所述的模拟器的生成装置,其特征在于,所述指令集配置文件包括每一指令的汇编输出格式、操作数类型及编码格式;所述指令包括操作数和操作码;所述解释器中用于根据所述指令集配置文件生成解码表包括生成指令码表模块,用于根据所述每一指令操作码生成指令码表;生成指令描述表模块,用于根据所述每一指令的汇编输出格式、操作数类型及编码格式生成指令描述表;生成位域表模块,用于根据所述每一指令的操作数生成位域表。
9.根据权利要求8所述的模拟器的生成装置,其特征在于,所述生成指令码表模块具体为根据每一指令操作码位域和各操作码位域的值生成具有层次的指令码表。
10.根据权利要求8或9所述的模拟器的生成装置,其特征在于,所述解释器生成解码算法包括获取汇编指令操作码算法模块、获取汇编指令操作码相关信息算法模块和获取汇编指令操作数算法模块三部分;所述解释器中用于根据所述指令集配置文件生成解码算法具体包括按照由所述指令集配置文件生成所述指令码表的规则,生成用于在所述指令码表中查找二进制指令操作码对应的汇编指令操作码的解码算法的获取汇编指令操作码算法模块;按照由所述指令集配置文件生成所述指令描述表的规则以及所述指令码表和所述指令描述表之间的索引关系,生成用于根据所述汇编指令操作码索引所述指令描述表并在索引到的指令描述表中读取汇编指令操作码的相关信息的解码算法的获取汇编指令操作码相关信息算法模块;按照由所述指令集配置文件生成所述位域表的规则,以及所述指令描述表和所述位域表之间的索引关系,生成用于根据所述汇编指令操作码的相关信息索引位域表并根据索引到的位域表计算出汇编指令操作数的解码算法的获取汇编指令操作数算法模块。
11.根据权利要求10所述的模拟器的生成装置,其特征在于,所述解码表还包括与所述指令码表之间存在索引关系的间接索引表;按照由所述指令集配置文件生成所述指令码表的规则,生成用于在所述指令码表中查找二进制指令操作码对应的汇编指令操作码的解码算法的获取汇编指令操作码算法模块包括按照由所述指令集配置文件生成所述指令码表和间接索引表的规则,以及所述指令码表和所述间接索引表之间的索引关系,生成用于在所述指令码表中查找二进制指令操作码对应的汇编指令操作码的解码算法的获取汇编指令操作码算法模块。
12.根据权利要求7 11任一项所述的模拟器的生成装置,其特征在于,在所述获取单元中的同一指令集配置文件中,一条指令在一个指令集中或者在至少两个不同的指令集中。
13.根据权利要7 12任一项所述的模拟器的生成装置,其特征在于,所述解释器中的解码算法包括直接查找法和间接索引法。
全文摘要
本发明公开了一种模拟器的生成方法及装置,涉及生成模拟器领域,用于实现模拟器的快速移植性和高效性。一种模拟器的生成方法,包括获取指令集配置文件;根据所述指令集配置文件生成解码表和解码算法;所述解码表包括指令码表,指令描述表和位域表;其中,所述指令码表中记录有汇编指令操作码,所述指令描述表记录有每条汇编指令操作码的详细信息,所述位域表记录有计算每一个操作数位域上的数值的方法;根据所述解码表、所述解码算法和模块代码生成模拟器;所述模块代码是用于模拟汇编指令的动作的代码和解码过程中非解码算法的代码。本发明的方案适用于模拟器的生成。
文档编号G06F9/455GK102521011SQ20111036944
公开日2012年6月27日 申请日期2011年11月18日 优先权日2011年11月18日
发明者叶寒栋, 曹炯, 赵鹏, 郑森火 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1