CN114385242A - 一种mips架构汇编指令接管的方法和装置 - Google Patents
一种mips架构汇编指令接管的方法和装置 Download PDFInfo
- Publication number
- CN114385242A CN114385242A CN202210005928.3A CN202210005928A CN114385242A CN 114385242 A CN114385242 A CN 114385242A CN 202210005928 A CN202210005928 A CN 202210005928A CN 114385242 A CN114385242 A CN 114385242A
- Authority
- CN
- China
- Prior art keywords
- instruction
- jump
- address
- user
- taken over
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3005—Arrangements for executing specific machine instructions to perform operations for flow control
- G06F9/30069—Instruction skipping instructions, e.g. SKIP
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/34—Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及嵌入式系统领域,特别是涉及一种MIPS架构汇编指令接管的方法和装置。主要包括:初始化原指令链表,获取需接管指令;根据二级跳转表,获取用户指令的跳转地址;根据用户指令的跳转地址,对指令列表中需接管指令进行修改;按照修改后的指令链表,执行指令链表中的指令。该方法能保证植入用户程序后源程序的正常运行,同时解决程序任意指令被接管后程序的正常跳转逻辑。
Description
【技术领域】
本发明涉及嵌入式系统领域,特别是涉及一种MIPS架构汇编指令接管的方法和装置。
【背景技术】
在系统指令管道或应用程序执行过程中,可能存在某些功能无法满足用户需要的情况。在实际使用中,为了确保系统的正常运行,可能无法或不易对原有系统或源程序进行完全替换。此时,可以仅对无法满足用户需要的部分指令替换为用户所需的指令,该过程称为指令接管。
在一般的软件系统中,可以通过系统提供的指令接管接口,将原有的指令替换为用户需要的指令。但是,在MIPS指令架构中,目前尚未提供直接进行指令接管的方法。
鉴于此,如何克服现有技术所存在的缺陷,解决MIPS指令架构中无法进行指令接管的现象,是本技术领域待解决的问题。
【发明内容】
针对现有技术的以上缺陷或改进需求,本发明解决了MIPS汇编指令架构中无法进行指令接管的问题。
本发明实施例采用如下技术方案:
第一方面,本发明提供了一种MIPS架构汇编指令接管的方法,具体为:初始化原指令链表,获取需接管指令;根据二级跳转表,获取用户指令的跳转地址;根据用户指令的跳转地址,对指令列表中需接管指令进行修改;按照修改后的指令链表,执行指令链表中的指令。
优选的,获取用户指令的跳转地址,具体包括:获取当前进程需使用的所有二级跳转表中的地址信息,其中,地址信息至少包含:对应的符号信息、所在的模块和跳转地址中的一项或多项;将地址信息组合为二级跳转表地址链表;根据二级跳转表地址链表,获取用户指令的跳转地址。
优选的,对指令列表中需接管指令进行修改,具体包括:将指令链表中需接管指令替换为对应的跳转指令,跳转指令的跳转地址为用户指令的跳转地址;在跳转指令之后插入一条空操作指令。
优选的,跳转地址具体包括:根据用户指令所在模块的起始地址和用户指令占用的存储空间大小,计算跳转地址的起始地址和结束地址。
优选的,将指令链表中需接管指令替换为对应的跳转指令,具体包括:根据用户指令的信息,生成用户指令对应的指令节点;使用用户指令对应的节点替换指令列表中需接管指令对应的指令节点。
优选的,当指令链表中存在一条分支跳转指令,该分支跳转指令的跳转位置为需接管指令下一条指令,还包括:将所有所述分支跳转指令的跳转地址修改为需接管指令的下一条指令在二级跳转表中的地址。
优选的,执行指令链表中的指令,具体包括:根据指令链表执行至替换后的需接管指令所在指令节点;根据替换后的指令节点中的跳转地址,跳转至用户指令对应的指令模板进行执行;指令模板中的指令执行完成后,跳转至指令链表中下一个指令节点。
优选的,跳转至用户指令对应的指令模板进行执行,还包括:进行跳转之前,将用户指令对应的寄存器的值保存至存储器中;执行完成后,将保存至存储器中的数据还原至原存储器中。
优选的,根据指令链表执行至替换后的需接管指令所在指令节点之后,还包括:判断指令节点是否已被激活;若否,对指令节点进行激活并执行;若是,不对指令节点进行激活。
另一方面,本发明提供了一种MIPS架构汇编指令接管的装置,具体为:包括至少一个处理器和存储器,至少一个处理器和存储器之间通过数据总线连接,存储器存储能被至少一个处理器执行的指令,指令在被处理器执行后,用于完成第一方面中的MIPS架构汇编指令接管的方法。
与现有技术相比,本发明实施例的有益效果在于:通过指令替换和二级跳转表对实际执行的指令进行替换,使得现有MIPS指令架构中能够植入任意用户程序,完成指定功能。该方法能保证植入用户程序后源程序的正常运行,同时解决程序任意指令被接管后程序的正常跳转逻辑。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种MIPS架构汇编指令接管的方法流程图;
图2为本发明实施例提供的另一种MIPS架构汇编指令接管的方法流程图;
图3为本发明实施例提供的另一种MIPS架构汇编指令接管的方法流程图;
图4为本发明实施例提供的另一种MIPS架构汇编指令接管的方法流程图;
图5为本发明实施例提供的另一种MIPS架构汇编指令接管的方法流程图;
图6为本发明实施例提供的一种MIPS架构汇编指令接管的装置结构示意图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
本发明是一种特定功能系统的体系结构,因此在具体实施例中主要说明各结构模组的功能逻辑关系,并不对具体软件和硬件实施方式做限定。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。
实施例1:
为了满足,需要在原有程序在执行到该被接管的指令时,不按照原指令运行,而能执行用户植入的特定功能。为了植入用户功能,需要根据用户需求,替换函数中的指定汇编指令,将函数中指定的汇编指令替换为跳转指令,跳转到用户指定的地址,然后在该指定地址植入特定功能的程序,从而完成功能的替换。
如图1所示,本发明实施例提供的MIPS架构汇编指令接管的方法具体步骤如下:
步骤101:初始化原指令链表,获取需接管指令。
为了对需接管的指令进行替换,首先需要在原始程序中查找到需接管的指令。在具体实施中,为了便于查找,也便于后续的指令替换和运行时的管理,可以将原始程序中的指令组织为指令链表。指令链表中的每个指令节点包含指令原地址、指令长度、指令的二级跳转表地址和二级跳转表地址长度。将原始指令组织为指令列表后,逐条解析指令列表中的函数指令,即可判断当前指令是否为需接管的指令。若是需接管的指令,按照步骤103的方式进行修改替换;若不是需替换指令,则直接处理下一条指令。进一步的,若原始指令中存在函数调用,还需要根据调用的函数地址,对被调用的函数中相应的需替换指令进行查找和替换。对指令列表中的所有指令节点进行遍历后,即可获取到原始指令中所有需接管指令。
步骤102:根据二级跳转表,获取用户指令的跳转地址。
在MIPS架构下,实现特定功能的一组汇编指令通过指令模板进行存储,指令模板类似函数的代码一样,放在在程序编译时放在代码text段中,在跳转至指令模板时被自动载入内存执行。指令模板中的地址等信息采用的是通用地址,在实际完成每个指令的特定功能时需要将该通用地址修改为具体的地址,每个指令模板相当于一个汇编函数,在调用时根据需要传入具体的参数。指令模板存储在不同的模块中,每个模块相当于一个动态链接库。为了进行指令接管,将需接管的指令重定向至用户指令对应的指令模板进行重定向。
在本实施例中,通过二级跳转表实现指令函数的重定向,从而完成指令替换。通过修改编译链接脚本,在每个动态链接库的text段内预留一段有名字区域预埋区,称为二级跳转表。每个二级跳转表都保存了相应函数或变量符号名的用户指令。
进一步的,为了便于对二级跳转表中的指令地址进行使用,本实施例中将所有二级跳转表中的跳转地址组织为二级跳转表地址链表,二级跳转表地址链表中的每个元素代表二级跳转表中的一个表项,即代表一个需跳转的用户指令模板所对应的地址信息。以二级跳转表所在模块的起始地址作为每个二级跳转表中第一个指令模板的起始地址;根据用户指令所在模块的起始地址和用户指令占用的存储空间大小,计算跳转地址的结束地址。例如,用户指令中包含48条汇编指令,由于MIPS的指令为32位4字节,因此每个指令模板占用192字节长度,跳转地址的结束地址即为模块的开始地址+192。由于模块中不同表项的指令模板连续存放,因此,上一指令模板跳转地址的结束地址,就是下一指令指令模板跳转地址的开始地址。
根据二级跳转表所在的模块名、跳转地址的起始地址和结束地址,即可确定用户指令的保存位置,完成用户指令的跳转替换。
如图2所示,可以通过以下步骤建立二级跳转表地址链表,并通过二级跳转表地址链表获取用户指令的跳转地址。
步骤201:获取当前进程需使用的所有二级跳转表中的地址信息。
为了建立二级跳转表地址链表,需要获取当前进程所有需要使用的二级跳转表对应的地址信息。首先遍历程序中的所有符号,根据二级跳转表中的符号名获取二级跳转表中所有符号对应的地址信息。地址信息包括符号地址、大小等符号信息,还包括二级跳转表所在模块的名称,还有跳转地址的开始地址和结束地址等信息。获取到每个二级跳转表的地址信息后,还需要将地址信息组织为二级跳转表地址链表的元素,每个元素用于记录一个二级跳转表对应的模块名称、预埋区、开始地址、结束地址、预埋区空闲地址、当前元素大小及已使用的元素个数。
步骤202:将二级跳转表中的信息组合为二级跳转表地址链表。
获取到每个二级跳转表对应的元素后,即可将所有元素组合为二级跳转表地址链表。实际使用中,二级跳转表地址链表的结构体可以包含三个成员:二级跳转表个数、二级跳转表结构体头部指针、二级跳转表尾部指针。结构体构建完毕,并对每个进行初始化赋零操作后,即可向链表中添加步骤201中获取到的每个二级跳转表对应的元素。
步骤203:根据二级跳转表地址链表,获取需使用的二级跳转表的地址。
将二级跳转表对应的跳转地址组织为二级跳转表地址链表后,通过遍历扫描二级跳转表中的符号名,能够获取到二级跳转表中所有预留地址,即获取到用于替换的用户指令所在的地址。
通过步骤201-步骤203,即可完成二级跳转表地址链表的组织,方便了后续步骤中用户指令地址的获取。
步骤103:根据用户指令的跳转地址,对指令列表中需接管指令进行修改。
在指令链表中查找到需接管的指令后,即可如图3所示,通过以下步骤对指令列表中需接管指令进行修改。
步骤301:将指令链表中需接管指令替换为对应的跳转指令,跳转指令的跳转地址为用户指令的跳转地址。
本实施例提供的方法中,通过跳转指令将需接管的指令改变为跳转至用户指令所在地址的跳转指令,完成指令的接管替换。为了实现跳转,需要根据指令地址和所在模块获取用户指令的二级跳转表地址信息。具体的,跳转指令可以使用j指令、jmp指令等直接跳转指令,也可以根据实际需要使用jalr等条件跳转指令实现仅在某些场景下的接管。跳转指令中的跳转地址为步骤101中获取到的跳转指令。
在使用指令链表的情况下,可以将指令链表中需接管指令的指令节点移除,根据用户指令的信息,生成用户指令对应的指令节点,再将指令节点插入需接管指令在指令链表的原位置,使用用户指令对应的节点替换指令列表中需接管指令对应的指令节点。具体的,为跳转指令的指令节点分配内存空间,将跳转指令所在函数名,指令地址,指令长度,指令的二级跳转表地址和指令是否激活标志位等信息拷贝存储进指令节点结构体中。
进一步的,若程序逻辑中仍需要执行需接管指令,可以将需接管指令也加入用户指令的指令模板中;或根据执行顺序,将需接管指令加入用户指令的二级跳转表中。例如:需接管的指令为写内存指令,用户需要在写内存之前增加内存检测功能,可以将内存检测指令和写内存指令同时放入用户指令的指令模板进行整体替换;也可以将原指令链表中的写内存指令替换为内存检测指令,并将写内存指令拷贝至内存检测指令所在的二级跳转表相应的表项中。
步骤302:在跳转指令之后插入一条空操作指令。
由于MIPS架构CPU采取5级流水线操作,为了提高流水线的效率,针对分支指令引入了分支延时槽,即在执行分支跳转语句前,会先执行分支延时槽中的指令,然后再执行分支跳转指令。由于指令接管的本质是将需要被接管的指令替换为跳转语句,方便植入我们的功能。在MIPS架构下进行程序指令接管时,为了不改变程序的正常执行流程,需要将被接管指令的下一条语句的位置插入nop,即空操作指令。
通过步骤301-步骤302,可以将原指令链表中需接管的指令替换为指向接管后用户指令的跳转指令,执行至原需接管指令的位置时,按照正常执行流程自动跳转至用户指令,完成指令替换。
进一步的,在某些具体实施场景中,在原指令链表中可能存在一条或多条分支跳转指令,这些分支跳转指令的跳转地址为需接管指令的下一条指令。在本实施例中,根据步骤302插入空语句后,原指令链表中需跳转指令的下一跳指令变化为空指令,若不对这些分支跳转指令进行处理,会出现跳转至空指令的错误。因此,还需要将所有分支跳转指令的跳转地址修改为需接管指令的下一条指令在二级跳转表中的地址,以确保原分支跳转指令的跳转位置正确。
步骤104:按照修改后的指令链表,执行指令链表中的指令。
完成指令链表中指令的替换后,即可根据指令链表进行执行。
具体的,如图4所示,可以通过以下步骤完成指令链表中指令的执行。以下过程与MIPS架构下指令执行的一般过程一致,因此在完成指令链表的替换后,可以实现指令的自动接管。
步骤401:根据指令链表执行至替换后的需接管指令所在指令节点。
对于指令链表中无需接管的指令,按照一般的执行方式,根据链表中的指令进行执行,直至执行到原需接管所在位置,即当前被替换后的需接管指令所在的位置。
步骤402:根据替换后的指令节点中的跳转地址,跳转至用户指令对应的指令模板进行执行。
执行到替换后的需接管指令所在位置时,由于需接管指令已被替换为跳转至用户指令位置的跳转指令。此时,执行跳转指令,根据跳转指令中的跳转地址进行跳转,即可根据二级跳转表跳转至用户指令对应的指令模板,依照指令模板完成用户所需的功能。
步骤403:指令模板中的指令执行完成后,跳转至指令链表中下一个指令节点。
本实施例中,保留了原指令链表中无需替换的部分,仅将需接管用户指令所在节点的需接管指令替换为相应的跳转指令。根据指令链表跳转至用户指令并执行完成后,即可按照一般执行流程,跳转回指令列表,继续向后执行,已达到仅接管替换部分功能模块而不影响原程序流程的效果。
通过步骤401-步骤403,基于已替换的指令链表,完成了运行时的指令接管,在不影响原程序流程的情况下自动使用用户指令替代需接管的指令,完成指令接管。
进一步的,为了确保程序运行时各寄存器的数据正确,在运行用户指令之前还需要保存现场,将用户指令对应的寄存器的值保存至存储器中;在运行完用户指令后还需要恢复现场,将保存至存储器中的数据还原至原存储器中。
具体的,如图5所示,步骤401-步骤403需要扩展为以下步骤。
步骤501:根据指令链表执行至替换后的需接管指令所在指令节点。
步骤502:将用户指令相关的寄存器值保存进数据存储器中。
步骤503:根据替换后的指令节点中的跳转地址,跳转至用户指令对应的指令模板进行执行;
步骤504:指令模板中的指令执行完成后,将保存至数据存储器中的寄存器值取出,还原到相关寄存器中。
步骤505:跳转至指令链表中下一个指令节点。
通过步骤501-步骤505,在进行接管时对程序执行的现场进行了保存和恢复,避免了接管时的跳转对原程序流程的影响。
进一步的,在本实施例中,指令替换和指令执行分别进行,可以每次执行前替换相应的用户指令,也可以一次替换后多次执行。步骤101-步骤103中仅对指令进行指令链表的预处理和替换,不对具体指令进行执行,在步骤104中才根据替换修改后的完整指令链表进行执行。在对原指令链表中需接管的指令节点进行替换后,可以在该指令节点上设置激活标志位,此时替换后的指令节点还未被激活执行,因此标志位的激活状态为否。在步骤401或步骤501中,根据指令链表执行至替换后的需接管指令所在位置之后,判断指令是否已被激活。若标志位的激活状态为否,说明需替换指令已被替换但未被激活执行,对指令进行激活并执行;若是,表明替换后的指令已被执行过,对指令不进行激活。
根据本实施例提供的MIPS架构汇编指令接管的方法,通过创建二级跳转表项,解析原指令链表中需要替换的指令并进行预处理和用户指令替换,使得原程序运行到需接管指令时能自动跳转到二级跳转表中执行用户植入功能。该方法能够实现任意指令的接管和跳转,并能保证程序接管后的正常执行和逻辑跳转,为MIPS架构的嵌入式系统提供了一种指令接管的新思路。
实施例2:
基于实施例1提供的MIPS架构汇编指令接管的方法,为了对的技术方案进行更加清晰的说明,本实施例中提供了一个在实际场景中的使用实例。在MIPS系统中,不同的CPU架构中字节位数不同。为了简便起见,本实施例以通用的32位MIPS CPU架构为例进行说明。本实施例中仅以一个功能具体的功能实力处理过程进行说明,,如果有需求说要替换类似这种逻辑判断指令,也可以采用类似方法实现。
在某个具体场景中,原功能模块的源程序语句如下。其中,用户需要将写内存语句之前增加内存检测语句。
该函数中涉及到的需替换的写内存语句有:
int a[10];
memset(a,0,sizeof(a));
a[0]=1;
该组写内存语句作用是,首先申请一个拥有10个成员的整型数组a,然后对数组a进行内存清零操作,再将第一个成员a[0]赋值为1。
根据步骤101,初始化原指令链表。该组语句对应的汇编指令的原指令链表如下,为了描述简便,以下仅列出与本方案相关的语句,每条语句对应一个指令节点。
第1条:0x0043d80c addiu sp,sp,-72
第2条:0x0043d810 sw ra,68(sp)
第3条:0x0043d814 sw s8,64(sp)
第4条:0x0043d818 move s8,sp
第5条:0x0043d81c lui gp,0x62
第6条:0x0043d820 addiu gp,gp,21088
第7条:0x0043d824 sw gp,16(sp)
第8条:0x0043d828 addiu v0,s8,24
第9条:0x0043d82c move a0,v0
第10条:0x0043d830 move a1,zero
第11条:0x0043d834 li a2,40
第12条:0x0043d838 lw v0,-28900(gp)
第13条:0x0043d83c move t9,v0
第14条:0x0043d840 jalr t9
第15条:0x0043d844 move at,at
第16条:0x0043d848 lw gp,16(s8)
第17条:0x0043d84c li v0,1
第18条:0x0043d850 sw v0,24(s8)
第19条:0x0043d854 lui v0,0x5e
第20条:0x0043d858 addiu v1,v0,26476
对上述原指令链表中的指令进行分析,可知第2条和第3条指令对应语句int a[10];第7条和第8条指令对应语句memset(a,0,sizeof(a));第18条和第19条指令对应语句a[0]=1。在本实施例中,内存检测语句和写内存语句依次存放在同一指令模板中,在修改替换时,直接将上述指令替换为跳转至相应指令模板的跳转指令。
根据步骤102,根据实际编译情况,建立本实施例需使用的二级跳转表。建立二级跳转表后,获取到需替换的写内存指令对应的用户指令所在二级跳转表名为“MemcheckJumpTableEntryBegin_0”,其中第一个指令模板的跳转起始地址为MemcheckJumpTableEntryBegin_0,后续的指令模板起始地址依次根据前一指令模板的结束地址进行计算,例如,第2条指令在二级跳转表中的指令模板中为48条汇编指令,由于MIPS的指令为4字节,因此每个指令模板占用192字节长度,因此第7条指令对应的跳转地址为0+192,第18条语句的跳转地址依次类推。
计算出每个语句的跳转地址后,根据步骤103,对原指令链表进行修改,将原指令链表中每个需替换指令对应的节点内容替换为相应的跳转语句,替换后的汇编指令链表如下。
第1条:0x0043d80c addiu sp,sp,-72
第2条:0x0043d810 j 0x6613e0<MemcheckJumpTableEntryBegin_0>
第3条:0x0043d814 nop
第4条:0x0043d818 move s8,sp
第5条:0x0043d81c lui gp,0x62
第6条:0x0043d820 addiu gp,gp,21088
第7条:0x0043d824 j 0x6614a0<MemcheckJumpTableEnt ryBegin_0+192>
第8条:0x0043d828 nop
第9条:0x0043d82c move a0,v0
第10条:0x0043d830 move a1,zero
第11条:0x0043d834 li a2,40
第12条:0x0043d838 lw v0,-28900(gp)
第13条:0x0043d83c move t9,v0
第14条:0x0043d840 jalr t9
第15条:0x0043d844 move at,at
第16条:0x0043d848 lw gp,16(s8)
第17条:0x0043d84c li v0,1
第18条:0x0043d850 j 0x661560<MemcheckJumpTableEnt ryBegin_0+384>
第19条:0x0043d854 nop
第20条:0x0043d858 addiu v1,v0,26476
在上述替换后的指令列表中,第2条和第3条指令被替换为跳转至二级跳转表MemcheckJumpTableEntryBegin_0中对应跳转地址的跳转语句和空操作指令nop;第7条和第8条指令以及第18条和第19条指令也是同样的效果。通过执行上述替换后的指令链表,可以根据用户指令对应的指令模板,将原有的写内存指令修改为指令模板中的内存检测+写内存指令,同时不会影响原指令链表其它部分的执行。
进一步的,在实际场景中,若包含跳转至原指令链表中第3条、第8条和第19条语句的分支跳转语句,还需要改变相应分支跳转语句的跳转位置,避免跳转至空语句,保证源程序的逻辑正确。
进一步的,如步骤501-步骤505,在二级跳转表MemcheckJumpTableE ntryBegin_0的指令模板中,还包含有保存数据现场和恢复现场的指令。
以第3条内存赋值语句a[0]=1;为例,增加保存现场和恢复现场后吗,通过反汇编二级跳转表MemcheckJumpTableEntryBegin_0,对写内存指令并预处理分析和替换指令的指令链表如下。
第1条:0x00661560 addiu sp,sp,-128
第2条:0x00661564 sw ra,16(sp)
第3条:0x00661568 sw s8,20(sp)
第4条:0x0066156c sw a0,24(sp)
第5条:0x00661570 sw a1,28(sp)
第6条:0x00661574 sw a2,32(sp)
第7条:0x00661578 sw a3,36(sp)
第8条:0x0066157c sw v0,40(sp)
第9条:0x00661580 sw v1,44(sp)
第10条:0x00661584 sw gp,48(sp)
第11条:0x00661588 move a0,s8
第12条:0x0066158c li a1,0
第13条:0x00661590 li a2,24
第14条:0x00661594 lui v0,0x5c
第15条:0x00661598 addi v0,v0,-5940
第16条:0x0066159c jalr v0
第17条:0x006615a0 move at,at
第18条:0x006615a4 lw ra,16(sp)
第19条:0x006615a8 lw s8,20(sp)
第20条:0x006615ac lw a0,24(sp)
第21条:0x006615b0 lw a1,28(sp)
第22条:0x006615b4 lw a2,32(sp)
第23条:0x006615b8 lw a3,36(sp)
第24条:0x006615bc lw v0,40(sp)
第25条:0x006615c0 lw v1,44(sp)
第26条:0x006615c4 lw gp,48(sp)
第27条:0x006615c8 addiu sp,sp,128
第28条:0x006615cc sw v0,24(s8)
第29条:0x006615d0 lui v0,0x5e
第30条:0x006615d4 addiu v1,v0,26476
第31条:0x006615d8 j 0x43d858<asontest+76>
其中,第1条指令语句获取跳转后的指令模板;第2条到第15条指令语句对应步骤502,保存运行环境寄存器值;第16条指令语句对应步骤503,跳转到用户替换后的指令进行执行,首先执行用户增加的内存检测语句;第17条到第27条指令语句对应步骤504,将寄存器值取出还原;第28条和第29条指令语句对应步骤执行a[0]=1内存赋值操作。由于二级跳转表中的第28和29两条语句就是指令替换前的原18和19条指令,即需替换的内存赋值语句。通过上述指令模板可知,将需替换的原内存复制语句拷贝进二级跳转表中后,执行完用户植入的内存检测功能程序,可以继续执行真正的内存赋值操作。因此,无论是直接功能直接替换或功能增加,都能够保证了植入的跳转和处理功能不影响原程序的正常运转。
第30条指令语句对应步骤跳转到下一条语句执行原指令链表中后续的printf打印语句,对应步骤505,在执行完用户指令的特定功能后,回到原指令链表,继续执行原指令链表的后续功能。。
由本方法中的实例可见,实施例1中提供的MIPS架构汇编指令接管的方法,能在接管任意指令并植入用户功能的同时,保证程序的正常运行。从而解决目前无法接管MIPS架构指令的问题。
实施例3:
在上述实施例1至实施例2提供的MIPS架构汇编指令接管的方法的基础上,本发明还提供了一种可用于实现上述方法的MIPS架构汇编指令接管的装置,如图6所示,是本发明实施例的装置架构示意图。本实施例的MIPS架构汇编指令接管的装置包括一个或多个处理器11以及存储器12。其中,图6中以一个处理器11为例。
处理器11和存储器12可以通过总线或者其他方式连接,图6中以通过总线连接为例。
存储器12作为一种MIPS架构汇编指令接管方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1至实施例2中的MIPS架构汇编指令接管方法。处理器11通过运行存储在存储器12中的非易失性软件程序、指令以及模块,从而执行MIPS架构汇编指令接管的装置的各种功能应用以及数据处理,即实现实施例1至实施例2的MIPS架构汇编指令接管的方法。
存储器12可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器12可选包括相对于处理器11远程设置的存储器,这些远程存储器可以通过网络连接至处理器11。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
程序指令/模块存储在存储器12中,当被一个或者多个处理器11执行时,执行上述实施例1至实施例2中的MIPS架构汇编指令接管的方法,例如,执行以上描述的图1-图5所示的各个步骤。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(Read Only Memory,简写为:ROM)、随机存取存储器(Random AccessMemory,简写为:RAM)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种MIPS架构汇编指令接管的方法,其特征在于:
初始化原指令链表,获取需接管指令;
根据二级跳转表,获取用户指令的跳转地址;
根据用户指令的跳转地址,对指令列表中需接管指令进行修改;
按照修改后的指令链表,执行指令链表中的指令。
2.根据权利要求1所述的MIPS架构汇编指令接管的方法,其特征在于,所述获取用户指令的跳转地址,具体包括:
获取当前进程需使用的所有二级跳转表中的地址信息,其中,地址信息至少包含:对应的符号信息、所在的模块和跳转地址中的一项或多项;
将地址信息组合为二级跳转表地址链表;
根据二级跳转表地址链表,获取用户指令的跳转地址。
3.根据权利要求1所述的MIPS架构汇编指令接管的方法,其特征在于,所述对指令列表中需接管指令进行修改,具体包括:
将指令链表中需接管指令替换为对应的跳转指令,跳转指令的跳转地址为用户指令的跳转地址;
在跳转指令之后插入一条空操作指令。
4.根据权利要求5所述的MIPS架构汇编指令接管的方法,其特征在于,所述跳转地址具体包括:
根据用户指令所在模块的起始地址和用户指令占用的存储空间大小,计算跳转地址的起始地址和结束地址。
5.根据权利要求3所述的MIPS架构汇编指令接管的方法,其特征在于,所述将指令链表中需接管指令替换为对应的跳转指令,具体包括:
根据用户指令的信息,生成用户指令对应的指令节点;
使用用户指令对应的节点替换指令列表中需接管指令对应的指令节点。
6.根据权利要求3所述的MIPS架构汇编指令接管的方法,其特征在于,当所述指令链表中存在一条分支跳转指令,该分支跳转指令的跳转位置为需接管指令下一条指令,还包括:
将所有所述分支跳转指令的跳转地址修改为需接管指令的下一条指令在二级跳转表中的地址。
7.根据权利要求1所述的MIPS架构汇编指令接管的方法,其特征在于,所述执行指令链表中的指令,具体包括:
根据指令链表执行至替换后的需接管指令所在指令节点;
根据替换后的指令节点中的跳转地址,跳转至用户指令对应的指令模板进行执行;
指令模板中的指令执行完成后,跳转至指令链表中下一个指令节点。
8.根据权利要求7所述的MIPS架构汇编指令接管的方法,其特征在于,所述跳转至用户指令对应的指令模板进行执行,还包括:
进行跳转之前,将用户指令对应的寄存器的值保存至存储器中;
执行完成后,将保存至存储器中的数据还原至原存储器中。
9.根据权利要求7所述的MIPS架构汇编指令接管的方法,其特征在于,所述根据指令链表执行至替换后的需接管指令所在指令节点之后,还包括:
判断指令节点是否已被激活;
若否,对指令节点进行激活并执行;
若是,不对指令节点进行激活。
10.一种MIPS架构汇编指令接管的装置,其特征在于:
包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储能被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成权利要求1-9中任一项所述的MIPS架构汇编指令接管的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210005928.3A CN114385242A (zh) | 2022-01-04 | 2022-01-04 | 一种mips架构汇编指令接管的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210005928.3A CN114385242A (zh) | 2022-01-04 | 2022-01-04 | 一种mips架构汇编指令接管的方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114385242A true CN114385242A (zh) | 2022-04-22 |
Family
ID=81200046
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210005928.3A Pending CN114385242A (zh) | 2022-01-04 | 2022-01-04 | 一种mips架构汇编指令接管的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114385242A (zh) |
-
2022
- 2022-01-04 CN CN202210005928.3A patent/CN114385242A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11216258B2 (en) | Direct function call substitution using preprocessor | |
JP5284103B2 (ja) | ソフトウェアトランザクショナルメモリ動作の最適化 | |
CN111124550B (zh) | 一种程序动态加载方法、装置及存储介质 | |
JP5681473B2 (ja) | プログラムの最適化装置、最適化方法および最適化プログラム | |
US8806436B2 (en) | Systems and methods for debugging applications using dual code generation | |
US20110119660A1 (en) | Program conversion apparatus and program conversion method | |
JP3901180B2 (ja) | プログラム並列化装置及びその方法並びにプログラム | |
US11579856B2 (en) | Multi-chip compatible compiling method and device | |
JP2013533533A (ja) | コンピューティング・プラットフォーム内のワークロードの分配及び並列化 | |
JPH08507889A (ja) | スーパースカラマイクロプロセッサ用のプログラムから並行的に処理可能な命令グループを機械的に生成する方法 | |
US20150324200A1 (en) | Methods and apparatus to compile instructions for a vector of instruction pointers processor architecture | |
WO2017014318A1 (ja) | 命令セットシミュレータおよびそのシミュレータ生成方法 | |
CN107515739B (zh) | 提高代码执行性能的方法及装置 | |
Khatchadourian et al. | [Engineering Paper] A Tool for Optimizing Java 8 Stream Software via Automated Refactoring | |
CN107544811B (zh) | IOS平台隐藏dylib文件的方法、存储介质、电子设备及系统 | |
CN113157318A (zh) | 基于倒计时缓冲的gpdsp汇编移植优化方法及系统 | |
CN107408054A (zh) | 用于通用计算图形处理单元中的语言嵌入式编程的流控制 | |
CN112487092A (zh) | 一种基于区块链的智能合约调用方法及装置 | |
CN114385242A (zh) | 一种mips架构汇编指令接管的方法和装置 | |
US20060225049A1 (en) | Trace based signal scheduling and compensation code generation | |
CN114201375A (zh) | 一种在硬件环境上获取代码指令消耗的方法及装置 | |
WO2023155863A1 (en) | Methods and devices for compiler function fusion | |
US20230280987A1 (en) | System and method for controlling execution of call stack frames | |
CN117234953B (zh) | 一种基于影子代码缓存的内核调试方法 | |
US20050251795A1 (en) | Method, system, and program for optimizing code |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |