首页> 中国专利> 基于高级语言与汇编语言相关性的汇编指令转换方法

基于高级语言与汇编语言相关性的汇编指令转换方法

摘要

本发明公开了基于高级语言与汇编语言相关性的汇编指令转换方法,通过在已有平台上建立嵌入汇编指令的模板汇编指令与代码映射集,建立与无法反汇编的汇编指令相对应的高级语言代码,再通过在目标平台上编译高级语言代码形成目标平台的汇编指令,从而实现了已有平台与目标平台间的汇编指令转换,使开发者无需掌握目标平台的汇编指令和规则即可完成汇编指令的转换,节省了跨平台软件开发的时间成本,有效提高了开发效率,加快了开发进度。

著录项

  • 公开/公告号CN113282301A

    专利类型发明专利

  • 公开/公告日2021-08-20

    原文格式PDF

  • 申请/专利权人 北京麟卓信息科技有限公司;

    申请/专利号CN202110827966.2

  • 发明设计人 温研;

    申请日2021-07-22

  • 分类号G06F8/51(20180101);

  • 代理机构

  • 代理人

  • 地址 100085 北京市海淀区中关村科技装备(西三旗)创新创业基地27号3层310、312

  • 入库时间 2023-06-19 12:18:04

说明书

技术领域

本发明属于计算机系统编译开发技术领域,具体涉及基于高级语言与汇编语言相关性的汇编指令转换方法。

背景技术

在操作系统上进行软件开发时,为了方便程序设计、提高软件的运行效率或实现某种特殊功能,开发者往往需要使用汇编语言对高级语言进行优化,即在高级语言设计的程序代码中嵌入汇编代码实现优化。高级语言主要包括C语言和C++语言等。

现有技术中,在跨平台开发时,由于不同平台的指令集不同,各自的汇编代码间也存在差异,因此为了使原程序的功能在新平台仍然可用,主要采用以下两种方式完成迁移:一是采用将现有平台的汇编代码逆向为高级语言后再到新平台编译生成新平台的汇编代码的方式完成跨平台的代码迁移,二是采用动态指令转换的方式实现代码的迁移。

第一种方式的核心是完成高级语言中嵌入的汇编语言的迁移,由于嵌入的汇编语言本身存在的意义就是实现了高级语言无法实现的操作,所以这些嵌入的汇编指令通常也无法直接逆向成为高级语言,为此,开发者还需要针对新平台进行适应性的汇编指令的开发。然而,实际当中由于开发者缺乏新架构的开发经验、某些芯片厂商未提供指令集的说明文档等原因,都会给平台兼容开发带来很大阻碍,严重影响开发进度和效率。第二种方式的核心是完成二进制机器码在不同平台上的翻译,由于二进制动态指令转换需要相关开发者对目标架构非常熟悉,而且二进制机器码跨平台转化时往往代码量会有所增多,因此转换过程效率较低,且转换后的代码的执行开销较大。

发明内容

有鉴于此,本发明提供了基于高级语言与汇编语言相关性的汇编指令转换方法,能够实现不同平台间汇编指令的灵活高效的转换。

本发明提供的基于高级语言与汇编语言相关性的汇编指令转换方法,具体包括以下步骤:

步骤1、建立由高级语言编写的最简代码构成的最简代码集;所述最简代码为实现了单一功能的、具有最小代码量的高级语言代码;

步骤2、在待转换代码所在的已有平台上,编译所述最简代码集中的所有最简代码生成已有平台的汇编代码,由所述最简代码集对应的所有汇编代码构成汇编代码集合;解析所述汇编代码集合中的汇编代码得到由模板汇编指令组成的模板汇编指令集;

步骤3、根据所述模板汇编指令集归纳分析所述汇编代码集合,得到每个模板汇编指令所对应的所有汇编代码及最简代码;由确定出的所有最简代码形成模板汇编指令的模板最简代码集;选择所述模板最简代码集中具有最短汇编代码的最简代码作为所述模板汇编指令的模板代码,并形成所述模板汇编指令与所述模板代码间的映射关系;

步骤4、确定所述待转换代码中的待转换汇编指令,根据所述映射关系确定所述待转换汇编指令对应的模板代码作为有效高级语言代码,由所述待转换汇编指令与所述有效高级语言代码形成有效映射集;

步骤5、在目标平台上,编译所述有效映射集中的有效高级语言代码,生成所述目标平台的汇编指令,完成所述待转换汇编指令从所述已有平台到目标平台的转换。

进一步地,所述步骤2中解析所述汇编代码集合中的汇编代码得到由模板汇编指令组成的模板汇编指令集,包括以下步骤:

步骤2.1、选择所述汇编代码集合中的汇编代码,确定当前汇编代码中涉及的所有汇编指令;

步骤2.2、遍历所有汇编指令,分析汇编指令的操作码和操作数,由所述操作码确定汇编指令的功能,由所述操作数确定汇编指令使用的数据和寄存器;

步骤2.3、若完成了所述汇编代码集合中所有汇编代码的分析,则退出本流程;否则,执行步骤2.1。

进一步地,所述步骤4中确定所述待转换代码中的待转换汇编指令的过程为:确定汇编代码中所涉及的所有汇编指令;遍历所有汇编指令,分析汇编指令的操作码和操作数,由操作码确定汇编指令的功能,由操作数确定汇编指令使用的数据和寄存器。

进一步地,所述步骤4中根据所述映射关系确定所述待转换汇编指令对应的模板代码作为有效高级语言代码,包括以下步骤:

步骤4.1、在所述模板汇编指令中,找到与所述待转换汇编指令相对应的汇编指令作为有效模板汇编指令;

步骤4.2、根据映射关系,确定与所述有效模板汇编指令相对应的模板代码作为所述有效高级语言代码。

进一步地,所述步骤5中还包括对所述有效模板汇编指令中的汇编指令与所述待转换汇编指令的相关性标记。

进一步地,所述已有平台或目标平台为x86、ARM、MIPS、龙芯、申威或RISC-V。

进一步地,所述高级语言包括C语言和C++语言。

有益效果:

本发明通过在已有平台上建立嵌入汇编指令的模板汇编指令与代码映射集,建立与无法反汇编的汇编指令相对应的高级语言代码,再通过在目标平台上编译高级语言代码形成目标平台的汇编指令,从而实现了已有平台与目标平台间的汇编指令转换,使开发者无需掌握目标平台的汇编指令和规则即可完成汇编指令的转换,节省了跨平台软件开发的时间成本,有效提高了开发效率,加快了开发进度。

附图说明

图1为本发明提供的基于高级语言与汇编语言相关性的汇编指令转换方法的流程图。

具体实施方式

下面结合附图并举实施例,对本发明进行详细描述。

本发明提供的基于高级语言与汇编语言相关性的汇编指令转换方法,解决的问题是如何将已有平台上的嵌入了汇编代码的高级语言代码移植到异构的目标平台上,其核心思想是:根据高级语言与汇编语言的相关性,得到与已有平台的汇编代码相匹配的高级语言预选代码清单,从中选中具有最短汇编代码的高级语言代码作为符合新平台要求的高级语言代码,然后将生成的高级语言代码在新平台进行编译生成适用于新平台的汇编指令,完成汇编指令跨平台的转换。

本发明提供的基于高级语言与汇编语言相关性的汇编指令转换方法,方法流程如图1所示,包括以下步骤:

步骤1、建立高级语言的最简代码集。

采用高级语言编写软件开发中可能涉及的所有功能的最简代码集。最简代码集中包含多个最简代码,最简代码为实现某类功能的最小代码量的代码,如分别实现变量定义、变量赋值、数学运算、函数调用、条件语句、数组操作、指针操作等功能的代码。

步骤2、在已有平台上,编译最简代码集中的所有最简代码生成已有平台上的汇编代码,由最简代码集对应的所有汇编代码构成汇编代码集合A;解析汇编代码集合A中的所有汇编代码,得到汇编代码中涉及的汇编指令及汇编指令的详细信息,本发明中将得到的汇编指令及详细信息命名为模板汇编指令,由所有模板汇编指令组成模板汇编指令集。

解析汇编代码集合A中的所有汇编代码的过程包括:

确定汇编代码中所涉及的所有汇编指令;

遍历所有汇编指令,分析汇编指令的操作码和操作数,由操作码确定汇编指令的功能,由操作数确定汇编指令使用的数据和寄存器。

步骤3、根据步骤2得到的模板汇编指令的详细信息,对汇编代码集合A中的汇编代码进行归纳分析,确定每个模板汇编指令对应的所有汇编代码,进而确定相关的最简代码,由确定出的所有最简代码形成模板汇编指令的模板最简代码集;从模板最简代码集中选择具有最短汇编代码的最简代码作为模板汇编指令的模板代码,形成模板汇编指令与模板代码间的映射关系。

根据步骤2得到的汇编指令的详细信息,在汇编代码集合A中,筛选出包含模板汇编指令的所有汇编代码,根据汇编代码与最简代码间的对应关系,确定模板汇编指令对应的所有最简代码,形成模板汇编指令的模板最简代码集。

模板最简代码集中的最简代码通常不仅对应一个模板汇编指令,因此为了进一步提高转换效率,本发明选择模板最简代码集中具有最短汇编代码的最简代码作为模板汇编指令的模板代码。

步骤4、确定待转换代码中所嵌入的待转换汇编指令,根据步骤3形成的映射关系确定待转换汇编指令对应的模板代码作为有效高级语言代码,形成有效映射集。

步骤4.1、在待转换代码中找到嵌入的待转换汇编代码,采用步骤2中的汇编代码解析方法解析待转换汇编代码,过程如下:确定汇编代码中所涉及的所有汇编指令;遍历所有汇编指令,分析汇编指令的操作码和操作数,由操作码确定汇编指令的功能,由操作数确定汇编指令使用的数据和寄存器;

步骤4.2、在模板汇编指令中,找到与待转换汇编指令相对应的汇编指令作为有效模板汇编指令;

步骤4.3、根据映射关系,确定与有效模板汇编指令相对应的模板代码作为有效高级语言代码。

遍历所有的待转换汇编指令形成有效映射集。

步骤5、在目标平台上,编译步骤4中形成的有效模板汇编指令与代码映射集中的有效高级语言代码,生成与之对应的目标平台上的新平台汇编指令。

此外,为了进一步去除无效汇编指令提高转换后代码的执行效率,本发明中,还提供对有效模板汇编指令中的汇编指令与待转换汇编指令的相关性的标记,以辅助开发者剔除新平台汇编指令中与待转换汇编指令相关度较低的汇编指令。

实施例:

本实施例以ARM平台作为已有平台、以C语言作为高级语言、以MIPS平台作为目标平台为例,采用本发明提供的基于高级语言与汇编语言相关性的汇编指令转换方法,实现基于C语言的汇编指令从ARM平台到MIPS平台的转换,具体过程如下:

步骤1-1、汇编指令解析。

解析指令,对操作码和操作数进行分析,根据操作码定位功能,根据操作数定位数据和寄存器。

步骤1-2、构建汇编指令与代码映射集。

基于C语言编写所有类型的最简代码集,其包含的最简代码覆盖了C语言功能的所有类型代码,而且是以最小代码量构成,如变量定义、变量赋值、数学运算、函数调用、条件语句、数组操作、指针操作等。然后对相应代码进行编译生成对应的汇编指令。

然后对最简代码生成的汇编指令依次进行归纳,将包含某一汇编指令格式对应的C语言代码归类到此汇编指令下,此汇编指令在本发明中称为模板汇编指令。依次类推,将所有生成的汇编指令都归纳出对应的C语言代码集。以ARM平台“mov register, num”为例:

代码1:

void a()

{

int a[1];

a[0] = 1;

}

生成汇编

// 函数及int a[1] 汇编指令开始段

1 stp x29, x30, [sp, -32]!

2 add x29, sp, 0

3 adrp x0, __stack_chk_guard

4 add x0, x0, :lo12:__stack_chk_guard

5 ldr x1, [x0]

6 str x2 [x29, 24]

// a[0] = 1 汇编指令段

7 mov x1, 0

8 mov w0, 1

//函数及int a[1] 汇编指令结束段

9 str w0, [x29, 16]

10 nop

11 adrp x0, __stack_chk_guard

12 add x0, x0, :lo12:__stack_chk_guard

13 ldr x1, [x29, 24]

14 ldr x0, [x0]

代码2:

void a()

{

int a;

a = 1;

}

生成汇编

//函数及int a[1] 汇编指令开始段

1 sub sp, sp, #16

// a[0] = 1 汇编指令段

2 mov w0, 1

3 str w0, [sp, 12]

//函数及int a[1] 汇编指令结束段

4 nop

5 add sp, sp, 16

代码1中的“mov w0, 1”和代码2中的“mov w0, 1”即对应上述的模板汇编指令,其可以由 a[0]=1生成,也可以由a = 1生成,这对熟悉ARM平台汇编的开发者来说很容易定位。

实际上,最简代码中还会有其它可以生成符合此模板汇编指令的代码,需要在所有对应的C语言代码中,筛选出汇编代码最短的C语言代码作为模板汇编指令对应的C语言代码。假设只有以上两个代码符合要求,则代码2: [(“a = 1; , “2-3”), (“int a;”, “1,4-5”),(“sub sp, sp, #16”, … , “add sp, sp, 16”)]则为模板汇编指令“movregister num”的模板代码,模板汇编指令与对应的模板代码统称为模板汇编指令与代码映射。[]中内容即模板汇编指令与代码映射,里边包括三部分,第一个()中是与模板汇编指令对应的C语言代码,称之为必要模板指令,第二个()是保证此C语言代码可编译的必要代码段,但是在嵌入汇编中并不需要,称之为非必要模板指令,第三个()是完整C语言代码对应的汇编指令。“”中前边内容是具体的代码内容,后边数字是C语言对应汇编指令的行数范围。

根据以上方式,构建所有模板汇编指令与C语言代码映射,本发明称之为模板汇编指令与代码映射集。

步骤1-3、根据实际嵌入汇编指令匹配C语言代码。

依然利用步骤1的方式解析实际要转换的嵌入汇编指令,并与模板汇编指令与代码映射集中的模板汇编指令对比,找到相匹配的模板汇编指令,本发明称之为有效模板汇编指令,从而定位到相应的C语言代码,本发明称之为有效C语言代码。

根据此方案,依次匹配嵌入汇编指令对应的C语言代码,最终生成符合有效模板汇编指令与代码映射集。

步骤1-4、生成新架构汇编代码及对比结果。

将匹配到的代码利用新架构的编译器进行编译,使其生成对应的汇编指令。同时提取有效模板汇编指令与代码映射集中的模板代码信息,将对应原平台汇编指令也生成一个代码文件,并根据其中的信息,标记出必要模板指令和非必要模板指令。如下为步骤2针对ARM与MIPS平台对比。

ARM平台:

1 sub sp, sp, #16

2 mov w0, 1

3 str w0, [sp, 12]

4 nop

5 add sp, sp, 16

MIPS平台:

1 move $fp,$sp

2 li $2,1

3 sw $2,0($fp)

4 nop

5 move $sp,$fp

最后将两个文件提交给开发者,开发者可以通过对比二者的指令内容和特点即可实现对新架构汇编指令的裁剪,得到新架构的嵌入汇编指令。根据上表,对于不熟悉MIPS平台的开发者来说,很容易推断,MIPS的第2、3行即为有效的指令,并能够根据ARM平台的汇编经验很简单的对MIPS汇编指令作进一步裁剪,得到ARM平台“mov w0, 1”对应的汇编指令为“li $2, 1”。

此类比同样适用于其它平台,依然以上边的C语言代码为基础,其x86平台与ARM平台对比如下。

x86平台:

1 pushq %rbp

2 movq %rsp, %rbp

3 movl $1, -4(%rbp)

4 nop

5 popq %rbp

ARM平台:

1 sub sp, sp, #16

2 mov w0, 1

3 str w0, [sp, 12]

4 nop

5 add sp, sp, 16

很相似的指令,x86的汇编指令“movq %rsp,%rbp”对应着ARM汇编指令的“mov w0,1”。

MIPS平台与申威平台对比。

MIPS平台:

1 move $fp,$sp

2 li $2,1

3 sw $2,0($fp)

4 nop

5 move $sp,$fp

申威平台:

1 ldi $30,-32($30)

2 Stl $26,0($30)

3 stl $15,8($30)

4 mov $30,$15

5 ldi $1,1($31)

6 stw $1,16($15)

申威平台的汇编指令看似相对复杂,但是对于了解汇编指令的开发者不难分析出来,对于一个函数必定有进栈和出栈的过程,从汇编指令看是一个几乎完全对称的指令过程。从申威汇编指令中可以看出,1至4行和8至11行是完全对称的指令,第7行虽然比较特别,当函数内容为空时这个指令是一定存在的,因此,很容易得出结论,MIPS平台的汇编指令“li $2,1”对应的申威指令即为“ldi $1,1($31)”。

本发明提供的方法可应用于现有的各类平台,包括x86、ARM平台、MIPS平台、龙芯、申威及RISC-V等。

综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号