掌桥专利:专业的专利平台
掌桥专利
首页

一种函数调用方法、装置、设备及存储介质

文献发布时间:2024-04-18 19:59:31


一种函数调用方法、装置、设备及存储介质

技术领域

本发明涉及软件开发技术领域,特别涉及一种函数调用方法、装置、设备及存储介质。

背景技术

软件在调用其他三方库时往往需要包含三方库提供的头文件进行编译,如果三方库函数声明有改动,或者新加了一个函数,则需要更新头文件重新编译才能正常调用,对于IDE(Integrated Development Environment,集成开发环境)工具来说,事先是无法知道开发者会如何编写代码,也即无法确定开发者会调用哪些函数,可能是系统的函数,也可能是三方库提供的函数,而这些函数参数类型各异,参数个数也不相同,无法在IDE代码里提前声明所有的函数,限制了软件对各种函数的调用,灵活性较差。

发明内容

有鉴于此,本发明的目的在于提供一种函数调用方法、装置、设备和存储介质,能够实现灵活调用函数的功能,增强程序的可读性和可维护性。其具体方案如下:

第一方面,本发明公开了一种函数调用方法,包括:

通过用户代码层实时获取用户输入的当前代码信息;

通过解释层对所述当前代码信息执行预设代码编写操作,以得到解释后信息,将所述解释后信息发送至调用层;

利用所述调用层的汇编语言调用所述解释后信息,以便执行所述解释后信息中的目标函数,并得到执行结果。

可选的,所述通过用户代码层实时获取用户输入的当前代码信息,包括:

通过用户代码层实时获取用户输入的字符串格式的所述当前代码信息;其中,按照预设语法编写用于调用系统或三方库函数的所述当前代码信息;

获取所述当前代码信息对应的所述目标函数的函数名字、参数类型和参数值。

可选的,所述通过解释层对所述当前代码信息执行预设代码编写操作,以得到解释后信息,包括:

利用C语言对所述当前代码信息中的参数执行所述预设代码编写操作,以得到所述解释后信息。

可选的,所述利用C语言对所述当前代码信息中的参数执行所述预设代码编写操作,以得到所述解释后信息,包括:

基于所述目标函数的所述函数名字获得对应的函数地址;

基于所述函数地址、参数数量、所述参数类型、所述参数值以及预设C语言编写规则将所述当前代码信息转换为通过C语言进行识别的所述解释后信息。

可选的,所述将所述解释后信息发送至调用层之后,还包括:

通过所述调用层从所述解释后信息中提取所述函数地址以及参数数量;

基于所述参数数量以及预设参数地址计算规则计算每个参数对应的参数地址。

可选的,所述利用所述调用层的汇编语言调用所述解释后信息,以便执行所述解释后信息中的目标函数,并得到执行结果,包括:

基于所述函数地址、所述参数地址生成对应的汇编代码调用指令,以便基于所述汇编代码调用指令调用所述函数地址对应的所述目标函数,并将所述执行结果返回至所述解释层。

可选的,所述基于所述参数数量以及预设参数地址计算规则计算每个参数对应的参数地址之后,还包括:

基于所述参数地址将所述参数存储至寄存器中的目标内存块。

第二方面,本发明公开了一种函数调用装置,包括:

代码信息获取模块,用于通过用户代码层实时获取用户输入的当前代码信息;

代码编写模块,用于通过解释层对所述当前代码信息执行预设代码编写操作,以得到解释后信息,将所述解释后信息发送至调用层;

函数执行模块,用于利用所述调用层的汇编语言调用所述解释后信息,以便执行所述解释后信息中的目标函数,并得到执行结果。

第三方面,本发明公开了一种电子设备,包括:

存储器,用于保存计算机程序;

处理器,用于执行所述计算机程序,以实现如前述公开的函数调用方法的步骤。

第四方面,本发明公开了一种计算机可读存储介质,用于存储计算机程序;其中,所述计算机程序被处理器执行时实现如前述公开的函数调用方法。

可见,本发明提供了一种函数调用方法,包括:通过用户代码层实时获取用户输入的当前代码信息;通过解释层对所述当前代码信息执行预设代码编写操作,以得到解释后信息,将所述解释后信息发送至调用层;利用所述调用层的汇编语言调用所述解释后信息,以便执行所述解释后信息中的目标函数,并得到执行结果。由此可见,本发明通过在上层的用户代码层中任意编写代码确定需要调用的函数,然后通过解释层与调用层实现函数的调用,无需重复进行文件编译,实现了灵活调用函数的功能,增强了程序的可读性和可维护性。

附图说明

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

图1为本发明公开的一种函数调用方法流程图;

图2为本发明公开的函数调用系统结构示意图;

图3为本发明提供的函数调用装置结构示意图;

图4为本发明提供的一种电子设备结构图。

具体实施方式

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

目前,软件在调用其他三方库时往往需要包含三方库提供的头文件进行编译,如果三方库函数声明有改动,或者新加了一个函数,则需要更新头文件重新编译才能正常调用,对于IDE工具来说,事先是无法知道开发者会如何编写代码,也即无法确定开发者会调用哪些函数,可能是系统的函数,也可能是三方库提供的函数,而这些函数参数类型各异,参数个数也不相同,无法在IDE代码里提前声明所有的函数,限制了软件对各种函数的调用,灵活性较差。为此,本发明提供了一种函数调用方法,能够实现灵活调用函数的功能,增强了程序的可读性和可维护性。

本发明实施例公开了一种函数调用方法,参见图1所示,该方法包括:

步骤S11:通过用户代码层实时获取用户输入的当前代码信息。

本实施例中,通过用户代码层实时获取用户输入的当前代码信息。具体的,通过用户代码层实时获取用户输入的字符串格式的所述当前代码信息;其中,按照预设语法编写用于调用系统或三方库函数的所述当前代码信息;获取所述当前代码信息对应的所述目标函数的函数名字、参数类型和参数值。可以理解的是,如图2所示,本发明的整个系统包含三层:用户代码层、C语言解释层以及汇编语言调用层。上层是用户在IDE里自由编写的代码层,这一层的输入信息可以是字符串,用户在这一层可以调用任意函数。在用户进行编写时用需按照一定的语法编写代码,以便通过编写好的代码调用系统或三方库函数,代码中包含函数名字、参数类型和参数值。

步骤S12:通过解释层对所述当前代码信息执行预设代码编写操作,以得到解释后信息,将所述解释后信息发送至调用层。

本实施例中,通过用户代码层实时获取用户输入的当前代码信息之后,通过解释层对所述当前代码信息执行预设代码编写操作,以得到解释后信息,将所述解释后信息发送至调用层。也即,利用C语言对所述当前代码信息中的参数执行所述预设代码编写操作,以得到所述解释后信息。具体的,基于所述目标函数的所述函数名字获得对应的函数地址;基于所述函数地址、参数数量、所述参数类型、所述参数值以及预设C语言编写规则将所述当前代码信息转换为通过C语言进行识别的所述解释后信息。

进一步的,将所述解释后信息发送至调用层之后,通过所述调用层从所述解释后信息中提取所述函数地址以及参数数量;基于所述参数数量以及预设参数地址计算规则计算每个参数对应的参数地址,基于所述参数地址将所述参数存储至寄存器中的目标内存块。

可以理解的是,中层是IDE的解释层,在解释层利用C语言对当前代码信息进行编写,以解释来自用户编写的代码,根据要调用函数的名字获得对应的函数地址,并确定参数的个数、各个参数的类型以及参数值,转换为C语言可以识别的类型,然后调用下层的汇编语言函数。

步骤S13:利用所述调用层的汇编语言调用所述解释后信息,以便执行所述解释后信息中的目标函数,并得到执行结果。

本实施例中,通过解释层对所述当前代码信息执行预设代码编写操作,以得到解释后信息,将所述解释后信息发送至调用层之后,利用所述调用层的汇编语言调用所述解释后信息,以便执行所述解释后信息中的目标函数,并得到执行结果。具体的,基于所述函数地址、所述参数地址生成对应的汇编代码调用指令,以便基于所述汇编代码调用指令调用所述函数地址对应的所述目标函数,并将所述执行结果返回至所述解释层,再由解释层将所述执行结果返回至用户代码层。

可以理解的是,下层是IDE的调用层,接收解释层传过来的参数,这一层用汇编语言编写,实现函数的真正调用。在64位汇编中,参数分别存储在寄存器rcx,rdx,r8,r9以及后续的连续内存块中,如第5个参数的地址为rbp+(8*(5+1)),根据参数个数进行计算可以分别获取每个参数的地址和函数地址,基于函数地址和参数地址即可以使用call指令对函数地址进行调用,再将返回值传回到解释层,从而达到调用函数的目的。

在一种具体实施方式中,例如用户代码层示例如下:

std::string code="user32.dll,MessageBoxA,int,0,string,content,string,title,int,1";

调用MessageBoxA函数,并且参数依次为整数类型0、字符串类型content、字符串类型title、整数类型1。

IDEC语言解释层代码如下:

IDE汇编语言调用层代码如下:

用户在IDE里按照一定的语法编写代码;解释层解释用户输入的代码,得到函数地址、参数个数、参数类型和参数值;计算参数地址,将参数存放至寄存器,使用call指令对函数地址进行调用;将返回值传回到解释层,在不修改代码的情况下灵活调用各种函数,增强了程序的可读性和可维护性。

可见,本发明提供了一种函数调用方法,包括:通过用户代码层实时获取用户输入的当前代码信息;通过解释层对所述当前代码信息执行预设代码编写操作,以得到解释后信息,将所述解释后信息发送至调用层;利用所述调用层的汇编语言调用所述解释后信息,以便执行所述解释后信息中的目标函数,并得到执行结果。由此可见,本发明通过在上层的用户代码层中任意编写代码确定需要调用的函数,然后通过解释层与调用层实现函数的调用,无需重复进行文件编译,实现了灵活调用函数的功能,增强了程序的可读性和可维护性。

目前的现有技术中,例如用户调用系统的MessageBeep函数,此时在用户层编写如下代码:

MessageBeep,1

//在IDE解释层,解释用户层的代码如下

if(函数名=="MessageBeep")//如果是函数MessageBeep则去调用MessageBeep

{

MessageBeep(1);

}

//如果那用户又想调用其他函数,如MessageBoxA时则需要修改IDE解释层源代码,加入新的代码如下:

if(函数名=="MessageBeep")//如果是函数MessageBeep则去调用MessageBeep

{

MessageBeep(1);

}

else if(函数名=="MessageBoxA")//如果是函数MessageBoxA则去调用MessageBoxA

{

MessageBoxA(0,content,title,1);

}

对高级语言来说,在调用函数之前必须先声明函数,C语言,C++等众多开发语言都是如此,由于用户的业务是时时变化的,如果用户又想调用其他成千上万的函数就需要不停地修改IDE源代码并进行编译打包,操作繁琐并且很难知道用户增加的函数。因此本发明利用C语言和汇编语言相结合来解决上述问题,利用C语言解释参数以及得到函数地址,利用汇编语言支持可变参数的特性。

例如用户编写了如下代码:user32.dll,MessageBeep,1

用户希望调用系统的MessageBeep函数,此时通过Decode函数进行解释,得到函数MessageBeep地址以及参数;通过汇编代码AsmCall调用对应的函数。如果用户想再调用MessageBoxA函数,则通过Decode函数获取函数MessageBoxA地址以及参数,通过汇编语言去调用MessageBoxA。此时无需编写大量的if else语句,用户层的代码可以调用任何函数并且不需要修改IDE层的源代码。

本发明上层可任意编写代码进行函数调用,灵活调用不同参数类型、不同参数个数的函数,不需要修改IDE层的代码,解决了不事先在IDE里声明函数就无法调用函数的问题。本发明主要代码采用C语言,关键部分采用汇编语言,通过C语言和汇编语言相结合的方法,高效的实现灵活调用函数的功能,增强了程序的可读性和可维护性。

参见图3所示,本发明实施例还相应公开了一种函数调用装置,包括:

代码信息获取模块11,用于通过用户代码层实时获取用户输入的当前代码信息;

代码编写模块12,用于通过解释层对所述当前代码信息执行预设代码编写操作,以得到解释后信息,将所述解释后信息发送至调用层;

函数执行模块13,用于利用所述调用层的汇编语言调用所述解释后信息,以便执行所述解释后信息中的目标函数,并得到执行结果。

可见,本发明包括:通过用户代码层实时获取用户输入的当前代码信息;通过解释层对所述当前代码信息执行预设代码编写操作,以得到解释后信息,将所述解释后信息发送至调用层;利用所述调用层的汇编语言调用所述解释后信息,以便执行所述解释后信息中的目标函数,并得到执行结果。由此可见,本发明通过在上层的用户代码层中任意编写代码确定需要调用的函数,然后通过解释层与调用层实现函数的调用,无需重复进行文件编译,实现了灵活调用函数的功能,增强了程序的可读性和可维护性。

在一些具体实施例中,所述代码信息获取模块11,具体包括:

当前代码信息获取单元,用于通过用户代码层实时获取用户输入的字符串格式的所述当前代码信息;其中,按照预设语法编写用于调用系统或三方库函数的所述当前代码信息;

目标信息获取单元,用于获取所述当前代码信息对应的所述目标函数的函数名字、参数类型和参数值。

在一些具体实施例中,所述代码编写模块12,具体包括:

函数地址获取单元,用于基于所述目标函数的所述函数名字获得对应的函数地址;

解释后信息生成单元,用于基于所述函数地址、参数数量、所述参数类型、所述参数值以及预设C语言编写规则将所述当前代码信息转换为通过C语言进行识别的所述解释后信息;

解释后信息发送单元,用于将所述解释后信息发送至调用层;

函数地址与参数数量获取单元,用于通过所述调用层从所述解释后信息中提取所述函数地址以及参数数量;

参数地址计算单元,用于基于所述参数数量以及预设参数地址计算规则计算每个参数对应的参数地址;

参数存储单元,用于基于所述参数地址将所述参数存储至寄存器中的目标内存块。

在一些具体实施例中,所述函数执行模块13,具体包括:

汇编代码调用指令生成单元,用于基于所述函数地址、所述参数地址生成对应的汇编代码调用指令;

目标函数调用单元,用于基于所述汇编代码调用指令调用所述函数地址对应的所述目标函数;

执行结果返回单元,用于将所述执行结果返回至所述解释层。

进一步的,本发明实施例还提供了一种电子设备。图4是根据一示例性实施例示出的电子设备20结构图,图中的内容不能认为是对本发明的使用范围的任何限制。

图4为本发明实施例提供的一种电子设备20的结构示意图。该电子设备20,具体可以包括:至少一个处理器21、至少一个存储器22、电源23、通信接口24、输入输出接口25和通信总线26。其中,所述存储器22用于存储计算机程序,所述计算机程序由所述处理器21加载并执行,以实现前述任一实施例公开的函数调用方法中的相关步骤。另外,本实施例中的电子设备20具体可以为电子计算机。

本实施例中,电源23用于为电子设备20上的各硬件设备提供工作电压;通信接口24能够为电子设备20创建与外界设备之间的数据传输通道,其所遵循的通信协议是能够适用于本发明技术方案的任意通信协议,在此不对其进行具体限定;输入输出接口25,用于获取外界输入数据或向外界输出数据,其具体的接口类型可以根据具体应用需要进行选取,在此不进行具体限定。

另外,存储器22作为资源存储的载体,可以是只读存储器、随机存储器、磁盘或者光盘等,其上所存储的资源可以包括操作系统221、计算机程序222等,存储方式可以是短暂存储或者永久存储。

其中,操作系统221用于管理与控制电子设备20上的各硬件设备以及计算机程序222,其可以是Windows Server、Netware、Unix、Linux等。计算机程序222除了包括能够用于完成前述任一实施例公开的由电子设备20执行的函数调用方法的计算机程序之外,还可以进一步包括能够用于完成其他特定工作的计算机程序。

进一步的,本发明实施例还公开了一种计算机可读存储介质,所述存储介质中存储有计算机程序,所述计算机程序被处理器加载并执行时,实现前述任一实施例公开的函数调用方法步骤。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

以上对本发明所提供的一种函数调用方法、装置、设备及存储介质进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

技术分类

06120116523969