向内联汇编传递参数的方法、装置、设备以及存储介质与流程

文档序号:20680735发布日期:2020-05-08 18:22阅读:257来源:国知局
向内联汇编传递参数的方法、装置、设备以及存储介质与流程

本发明涉及计算机技术领域,尤其涉及一种向内联汇编传递参数的方法、装置、设备以及存储介质。



背景技术:

在计算机设计阶段,通常会将汇编语言插入其他高级语言(例如c语言)中进行编写,插入高级语言中的汇编语言编写的代码或者代码段也叫做内联汇编,结合两种语言的特点进行开发工作。采用汇编语言编写应用程序的核心代码,即可以弥补整个程序因使用高级语言带来的性能下降的缺憾,也兼顾了整个程序的简洁度。

现有技术中,由于编译器对于非内联汇编(即使用高级语言编写的代码或者代码段)向内联汇编传递参数的个数有限制,当传递的参数超出限制时,编译器则无法完成编译,例如,当非内联汇编向内联汇编传递的参数个数超过30个时,将导致编译失败。对此,本领域通常通过将内联汇编划分为更小的功能块来减少传递的参数的个数。

然而,划分之后的内联汇编小功能块之间需要借助内存传输数据,在实际应用场景中,由于内联汇编小功能块之间需要传输的数据和传输的次数均较多,会带来较大的内存损耗。



技术实现要素:

本发明提供一种向内联汇编传递参数的方法、装置、设备以及存储介质,使得在非内联汇编需要向内联汇编传递参数的数量超过编译器的最大限制时,依然能够成功编译,而不增加内存损耗。

第一方面,本发明提供一种向内联汇编传递参数的方法,在非内联汇编向内联汇编传递参数的数量超出编译器所限定的最大可传输参数的数量时,所述方法包括:

在编译至源程序的内联汇编时,根据所述内联汇编的参数读取指针,获取第一内存空间对应的首地址;

根据所述第一内存空间对应的首地址以及所述内联汇编中预设置的读取代码,读取所述第一内存空间中存储的第一参数;

其中,所述第一内存空间位于内存中,存储了非内联汇编向所述内联汇编传递的第二参数,所述第一参数为所述非内联汇编向所述内联汇编传递的第二参数中的至少一个。

可选的,

所述第二参数为所述非内联汇编向所述内联汇编传递的全部参数;

或者,

所述第二参数为所述非内联汇编向所述内联汇编传递的全部参数中的m个数量的参数,所述m的值不小于全部参数的数量加一再减去所述最大可传输参数的数量。

在一种具体的实现方式中,所述方法还包括:

将所述非内联汇编向所述内联汇编传递的第二参数设置为一个结构体,并将所述结构体存储于所述第一内存空间;

将所述第一内存空间对应的首地址赋值给所述内联汇编的参数读取指针,所述第一内存空间对应的首地址为所述结构体的第一个参数的存储空间对应的地址。

在一种具体的实现方式中,在所述内联汇编中预设置的读取代码指示读取第一内存空间中存储的全部参数时,所述方法还包括:

根据所述第一内存空间对应的首地址,依次读取所述第一内存空间中存储的全部参数。

在一种具体的实现方式中,在所述内联汇编中预设置的读取代码指示读取第一内存空间中存储的一至多个参数时,所述方法还包括:

根据预先定义的每个待传递的参数的数据类型,确定每个待读取的参数在第一内存空间中的偏移地址;

根据所述第一内存空间对应的首地址和所述每个待读取的参数在第一内存空间中的偏移地址,读取所述第一内存空间中存储的所述参数。

第二方面,本发明提供一种向内联汇编传递参数的装置,所述装置包括:

获取模块,用于在编译至源程序的内联汇编时,根据所述内联汇编的参数读取指针,获取第一内存空间对应的首地址;

读取模块,用于根据所述第一内存空间对应的首地址以及所述内联汇编中预设置的读取代码,读取所述第一内存空间中存储的第一参数;

其中,所述第一内存空间位于内存中,存储了非内联汇编向所述内联汇编传递的第二参数,所述第一参数为所述非内联汇编向所述内联汇编传递的第二参数中的至少一个。

可选的,

所述第二参数为所述非内联汇编向所述内联汇编传递的全部参数;

或者,

所述第二参数为所述非内联汇编向所述内联汇编传递的全部参数中的m个数量的参数,所述m的值不小于全部参数的数量加一再减去所述最大可传输参数的数量。

在一种具体的实现方式中,所述装置还包括:处理模块;

所述处理模块用于:

将所述非内联汇编向所述内联汇编传递的第二参数设置为一个结构体,并将所述结构体存储于所述第一内存空间;

将所述第一内存空间对应的首地址赋值给所述内联汇编的参数读取指针,所述第一内存空间对应的首地址为所述结构体的第一个参数的存储空间对应的地址。

在一种具体的实现方式中,在所述内联汇编中预设置的读取代码指示读取第一内存空间中存储的全部参数时,所述读取模块具体用于:

根据所述第一内存空间对应的首地址,依次读取所述第一内存空间中存储的全部参数。

在一种具体的实现方式中,在所述内联汇编中预设置的读取代码指示读取第一内存空间中存储的一至多个参数时,所述读取模块具体用于:

根据预先定义的每个待传递的参数的数据类型,确定每个待读取的参数在第一内存空间中的偏移地址;

根据所述第一内存空间对应的首地址和所述每个待读取的参数在第一内存空间中的偏移地址,读取所述第一内存空间中存储的所述参数。

第三方面,本发明提供一种电子设备,包括:存储器及处理器;

所述存储器存储计算机执行指令;

所述处理器执行所述存储器存储的计算机执行指令,使得所述处理器执行如第一方面所述的向内联汇编传递参数的方法。

第四方面,本发明提供一种存储介质,包括:可读存储介质和计算机程序,所述计算机程序用于实现第一方面所述的向内联汇编传递参数的方法。

本发明实施例提供的向内联汇编传递参数的方法、装置、设备以及存储介质,当编译至源程序的内联汇编,根据内联汇编的参数读取指针,获取第一内存空间对应的首地址,并根据第一内存空间对应的首地址以及内联汇编中预设置的读取代码,读取第一内存空间中存储的第一参数,其中,第一内存空间位于内存中,存储了非内联汇编向所述内联汇编传递的第二参数,第一参数为非内联汇编向内联汇编传递的第二参数中的至少一个。本方案在非内联汇编向内联汇编传递参数超过编译器所限定的最大可传输参数的数量时,通过预先将待传递的参数存储在内存中,使内联汇编能够从内存中读取参数,进而在不引起编译器报错的情况下,完成参数的传递;并且,现有技术中因受参数传递数量的限制而将内联汇编划分为多个小功能块,导致小功能块之间的数据传输给内存带来较大损耗,而本方案中对内存的操作,相较于内联汇编的小功能块之间的对内存的操作次数以及传输的数据均明显减少,降低了内存损耗。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的一种向内联汇编传递参数的方法实施例一的流程示意图;

图2为本发明实施例提供的一种向内联汇编传递参数的方法实施例二的流程示意图;

图3为本发明实施例提供的一种向内联汇编传递参数的装置实施例一的结构示意图;

图4为本发明实施例提供的一种向内联汇编传递参数的装置实施例二的结构示意图;

图5为本发明一实施例提供的电子设备的硬件结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本文中使用的术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

本发明的说明书中通篇提到的“一实施例”或“另一实施例”意味着与实施例有关的特定特征、结构或特性包括在本申请的至少一个实施例中。因此,在整个说明书各处出现的“在一实施例中”或“本实施例中”未必一定指相同的实施例。需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。

本方案提到的内联汇编是指在高级语言(例如c语言)的源程序中插入的汇编语言编写的代码或者代码段。汇编语言非常接近机器语言,相比较于高级语言来说执行的速度和效率更高,但是,汇编语言直接和硬件相关联,并且,不同的硬件平台支持的汇编指令不同,导致使用汇编语言编写的代码通常比较复杂、不易读且可移植性差;高级语言则具有代码简洁易读以及可移植性强的特点。因此,根据汇编语言和高级语言各自的优势,通常会结合两种语言的特点进行开发工作。因此,采用汇编语言编写应用程序的核心代码,即可以弥补整个程序因使用高级语言带来的性能下降的缺憾,也兼顾了整个程序的简洁度。相较于内联汇编而言,非内联汇编是指源程序中除内联汇编之外的其他高级语言(例如c语言)。

然而,包含内联汇编的源程序在编译的过程中,会因为非内联汇编向内联汇编传递的参数个数超过编译器的限制,而导致编译失败,对此,现有技术通过将内联汇编划分为更小的功能块来减少非内联汇编向内联汇编传递参数的个数,但是,将内联汇编划分为更小的功能块后,会在内联汇编的小功能块之间引入更多的中间数据,使得对内存的操作次数较多、传输数据较多,给内存带来较大的消耗。

针对上述问题,本方案提供的向内联汇编传递参数的方法,能够在完成编译的同时,减少对内存带来较大消耗。下面通过几个实施例对本方案的实现过程进行具体说明。

本方案的执行主体为一种电子设备,该电子设备可以应用于一种终端设备,例如,个人计算机pc、笔记本、平板、可穿戴产品、智能家居家电产品、智能机器人等,也可应用于一种服务器,或者,应用于一种工业设备,例如,数控设备、程控设备等。

本发明可应用于非内联汇编向内联汇编传递参数的任意场景中,尤其在非内联汇编向内联汇编传递参数的数量超出编译器所限定的最大可传输参数的数量时,本发明的优势将更加明显,图1为本发明实施例提供的一种向内联汇编传递参数的方法实施例一的流程示意图,如图1所示,该方法包括:

s101:在编译至源程序的内联汇编时,根据内联汇编的参数读取指针,获取第一内存空间对应的首地址。

其中,第一内存空间位于内存中,存储了非内联汇编向内联汇编传递的第二参数。应理解,通常情况下,在需要传递的参数数量较少,没有超出编译器的限制时,可以通过寄存器逐个传输参数,然而,在需要传递的参数数量较多时,尤其超出了编译器所限定的最大可传输参数的数量时,无法直接通过寄存器逐个传输参数,则需要将非内联汇编向内联汇编传递的第二参数存储于内存中的第一内存空间,再通过内联汇编读取参数,实现向内联汇编的传输。

上述第二参数可以是非内联汇编向内联汇编传递的全部参数;或者,第二参数可以是非内联汇编向内联汇编传递的全部参数中的m个数量的参数,可选的,m的值不小于全部参数的数量加一再减去所述最大可传输参数的数量。可选的,由于使用寄存器传递参数的速度更快,可设置通过寄存器传递编译器所限定的最大可传输参数减一个数量的参数,将剩余的参数存储于第一内存空间,即m的值等于全部参数的数量加一再减去所述最大可传输参数的数量。

例如,编译器对非内联汇编向内联汇编传递的参数个数存在30个的上限,假设需要传递的参数个数为40个,则可以将其中的11个待传递的参数存储于第一内存空间,将其余的29个参数通过寄存器逐个传递至内联汇编,存储于第一内存空间的参数个数可以是11至40个,使通过寄存器传递的参数个数小于30即可,优选的,存储于第一内存空间的参数个数为11时,即通过寄存器传递的参数数量达到编译器所限定的最大可传输参数数量的最大值时,传递参数的速度更快,效率更高。

在源程序的内联汇编中设置有参数读取指针,该参数读取指针被预先赋值了第一内存空间对应的首地址,例如,在非内联汇编将需要传递给的第二参数存储在内存中开辟的第一内存空间后,将第一内存空间的首地址赋值给内联汇编的参数读取指针,该首地址为第一内存空间中存储的第一个参数的地址。在编译器编译的过程中,当编译至源程序中的内联汇编时,根据内联汇编的参数读取指针,能够获取第一内存空间对应的首地址。

s102:根据第一内存空间对应的首地址以及内联汇编中预设置的读取代码,读取第一内存空间中存储的第一参数;

其中,第一参数为非内联汇编向内联汇编传递的第二参数中的至少一个。

在内联汇编中预设置的读取代码或者代码段,用于指示需要读取的参数,即第一参数,第一参数可以是第一内存空间中存储的全部参数,也可以是其中的任意数量的任意参数。在编译器编译的过程中,当编译至源程序中的内联汇编时,根据内联汇编中预设置的读取代码或者代码段,确定需要读取的参数,并根据第一内存空间对应的首地址,在第一内存空间中读取对应的第一参数。

作为一种示例,在上述内联汇编中预设置的读取代码指示读取第一内存空间中存储的全部参数时,本步骤包括:根据第一内存空间对应的首地址,依次读取第一内存空间中存储的全部参数。当编译至内联汇编时,根据预设置的读取代码,确定需要读取的参数为第一内存空间中存储的全部参数,则根据第一内存空间对应的首地址,从第一内存空间依次读取其中存储的全部参数,该全部参数即为第一参数。

作为另一种示例,在上述内联汇编中预设置的读取代码指示读取第一内存空间中存储的一至多个参数时,本步骤包括:根据预先定义的每个待传递的参数的数据类型,例如整型、长整型、字符型、浮点型等,确定每个待读取的参数在第一内存空间中的偏移地址,并根据第一内存空间对应的首地址和每个待读取的参数在第一内存空间中的偏移地址,读取第一内存空间中存储的至少一个参数。应理解,根据预先定义的每个待传递的参数的数据类型,可以确定每个参数的偏移地址,当编译至内联汇编时,根据预设置的读取代码,确定需要读取的参数,并根据第一内存空间对应的首地址和预先定义的每个待传递的参数的数据类型,确定需要读取的参数的地址,根据需要读取的每个参数的地址在第一内存空间中读取对应的参数。

本实施例提供的一种内联汇编传递参数的方法,在编译至源程序的内联汇编时,根据内联汇编的参数读取指针,获取第一内存空间对应的首地址,并根据第一内存空间对应的首地址以及内联汇编中预设置的读取代码,读取第一内存空间中存储的第一参数,其中,第一内存空间位于内存中,存储了非内联汇编向所述内联汇编传递的第二参数,第一参数为非内联汇编向内联汇编传递的第二参数中的至少一个。本方案在非内联汇编向内联汇编传递参数超过编译器的限制时,通过预先将待传递的参数存储在内存中,使内联汇编能够从内存中读取参数,进而在不引起编译器报错的情况下,完成参数的传递;并且,现有技术中因受参数传递数量的限制而将内联汇编划分为多个小功能块,导致小功能块之间的数据传输给内存带来较大损耗,而本方案中对内存的操作,相较于内联汇编的小功能块之间的对内存的操作次数以及传输的数据均明显减少,降低了内存损耗。

在上述实施例的基础上,图2为本发明实施例提供的一种向内联汇编传递参数的方法实施例二的流程示意图,如图2所示,该方法还包括:

s201:将非内联汇编向内联汇编传递的第二参数设置为一个结构体,并将结构体存储于第一内存空间。

在实际应用场景中,由于编译器的限制,当非内联汇编向内联汇编传递的参数的个数超过限制时,会导致编译器编译失败,对此,本方案将非内联汇编向内联汇编传递的全部或者部分参数设置为一个结构体。例如编译器限制非内联汇编向内联汇编传递的参数小于30,而非内联汇编需要向内联汇编传递的参数的数量为40,则可以将其中的至少11个参数设置为一个结构体,也可以将40个参数设置为一个结构体。

在本步骤中,可通过定义结构体并初始化结构体中的每个元素需要传递的参数,在内存中为该结构体开辟一段存储空间,称作第一内存空间,将结构体中的每个元素依次存入第一内存空间中。

例如,需要传递的参数如分别为:

int16_ta

int32_tb

int8_t*c

则定义如下结构体:

typedefstructstruct_para{

int16_ta;

int32_tb;

int8_t*c;

}struct_para;

定义结构体变量并初始化每个元素需要传递的参数。

struct_paratemp_para;

temp_para.a=a;

temp_para.b=b;

temp_para.c=c;

struct_para*p_temp_para=&temp_para;

s202:将第一内存空间对应的首地址赋值给内联汇编的参数读取指针。

第一内存空间对应的首地址为结构体的第一个参数的存储空间对应的地址。

在本步骤中,将第一内存空间对应的首地址通过赋值给内联汇编的参数读取指针,使内联汇编能够在参数读取指针指向的第一内存空间中读取对应的参数。

例如:

__asm__{

“内联汇编代码”

:

:[temp_para]”r”(p_temp_para)

:

}

双引号中的r表示将存储结构体的第一内存空间的首地址作为参数读取指针变量p_temp_para的内容存放在寄存器中,temp_para是这个寄存器在内联汇编中的别名,可以通过%[temp_para]来引用。这样就可以将需要传递给内联汇编的各个参数通过一个参数读取指针传递给了内联汇编,在内联汇编中需要使用各个参数时只需要从这个地址位基址的内存块中取值即可。

本实施例中,通过将非内联汇编向内联汇编传递的第二参数设置为一个结构体,并将结构体存储于第一内存空间,再将第一内存空间对应的首地址赋值给内联汇编的参数读取指针,该第一内存空间对应的首地址为结构体的第一个参数的存储空间对应的地址,通过定义结构体,实现了将多个待传递的参数作为一个整体进行传递,避免了因传递数据超出编译器限制引起的编译器报错的问题。

图3为本发明实施例提供的一种向内联汇编传递参数的装置实施例一的结构示意图,如图3所示,该向内联汇编传递参数的装置10包括:

获取模块11,用于在编译至源程序的内联汇编时,根据所述内联汇编的参数读取指针,获取第一内存空间对应的首地址;

读取模块12,用于根据所述第一内存空间对应的首地址以及所述内联汇编中预设置的读取代码,读取所述第一内存空间中存储的第一参数;

其中,所述第一内存空间位于内存中,存储了非内联汇编向所述内联汇编传递的第二参数,所述第一参数为所述非内联汇编向所述内联汇编传递的第二参数中的至少一个。

本实施例提供的向内联汇编传递参数的装置10包括:获取模块11和读取模块12,在编译至源程序的内联汇编时,根据内联汇编的参数读取指针,获取第一内存空间对应的首地址,并根据第一内存空间对应的首地址以及内联汇编中预设置的读取代码,读取第一内存空间中存储的第一参数,其中,第一内存空间位于内存中,存储了非内联汇编向所述内联汇编传递的第二参数,第一参数为非内联汇编向内联汇编传递的第二参数中的至少一个。本方案在非内联汇编向内联汇编传递参数超过编译器的限制时,通过预先将待传递的参数存储在内存中,使内联汇编能够从内存中读取参数,进而在不引起编译器报错的情况下,完成参数的传递;并且,现有技术中因受参数传递数量的限制而将内联汇编划分为多个小功能块,导致小功能块之间的数据传输给内存带来较大损耗,而本方案中对内存的操作,相较于内联汇编的小功能块之间的对内存的操作次数以及传输的数据均明显减少,降低了内存损耗。

在图3所示实施例的基础上,图4为本发明实施例提供的一种向内联汇编传递参数的装置实施例二的结构示意图,如图4所示,该向内联汇编传递参数的装置10还包括:处理模块13。

所述处理模块13用于:

将所述非内联汇编向所述内联汇编传递的第二参数设置为一个结构体,并将所述结构体存储于所述第一内存空间;

将所述第一内存空间对应的首地址赋值给所述内联汇编的参数读取指针,所述第一内存空间对应的首地址为所述结构体的第一个参数的存储空间对应的地址。

在一种可能的设计中,在所述内联汇编中预设置的读取代码指示读取第一内存空间中存储的全部参数时,所述读取模块12具体用于:

根据所述第一内存空间对应的首地址,依次读取所述第一内存空间中存储的全部参数。

在一种可能的设计中,在所述内联汇编中预设置的读取代码指示读取第一内存空间中存储的第二参数时,所述读取模块12具体用于:

根据预先定义的每个待传递的参数的数据类型,确定每个待读取的参数在第一内存空间中的偏移地址;

根据所述第一内存空间对应的首地址和所述每个待读取的参数在第一内存空间中的偏移地址,读取所述第一内存空间中存储的所述参数。

本实施例提供的向内联汇编传递参数的装置,可以执行上述方法实施例的技术方案,其实现原理和技术效果类似,本实施例此处不再赘述。

本发明实施例还提供一种电子设备,参见图5所示,本发明实施例仅以图5为例进行说明,并不表示本发明仅限于此。

图5为本发明一实施例提供的电子设备的硬件结构示意图。如图5所示,本实施例提供的电子设备200可以包括:存储器201、处理器202;可选的还可以包括总线203。其中,总线203用于实现各元件之间的连接。

所述存储器201存储计算机执行指令;

所述处理器202执行所述存储器201存储的计算机执行指令,使得所述处理器执行前述第一设备侧实施例提供的向内联汇编传递参数的方法。

其中,存储器和处理器之间直接或间接地电性连接,以实现非内联汇编向内联汇编传递参数。例如,这些元件相互之间可以通过一条或者多条通信总线或信号线实现电性连接,如可以通过总线连接。存储器中存储有实现数据访问控制方法的计算机执行指令,包括至少一个可以软件或固件的形式存储于存储器中的软件功能模块,处理器通过运行存储在存储器内的软件程序以及模块,从而执行各种功能应用以及数据处理。

存储器可以是,但不限于,随机存取存储器(randomaccessmemory,简称:ram),只读存储器(readonlymemory,简称:rom),可编程只读存储器(programmableread-onlymemory,简称:prom),可擦除只读存储器(erasableprogrammableread-onlymemory,简称:eprom),电可擦除只读存储器(electricerasableprogrammableread-onlymemory,简称:eeprom)等。其中,存储器用于存储程序,处理器在接收到执行指令后,执行程序。进一步地,上述存储器内的软件程序以及模块还可包括操作系统,其可包括各种用于管理系统任务(例如内存管理、存储设备控制、电源管理等)的软件组件和/或驱动,并可与各种硬件或软件组件相互通信,从而提供其他软件组件的运行环境。

处理器可以是一种集成电路芯片,具有信号的处理能力。上述的处理器202可以是通用处理器,包括中央处理器(centralprocessingunit,简称:cpu)、网络处理器(networkprocessor,简称:np)等。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

本发明实施例还提供一种计算机可读存储介质,其上存储有计算机执行指令,计算机执行指令被处理器执行时可以实现上述任一方法实施例提供的向内联汇编传递参数的方法。

本实施例中的计算机可读存储介质可以是计算机能够存取的任何可用介质,或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备,可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如ssd)等。

本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1