一种面向可变参函数的编译实现方法技术

技术编号:16390440 阅读:54 留言:0更新日期:2017-10-17 13:36
本发明专利技术公开一种面向可变参函数的编译实现方法,步骤为:1)获取函数原型中固定参数的个数,并根据固定参数的个数确定第一个可变参数存放位置;2)读取函数中参数,判断当前参数是否为可变参数,若为否,优先通过参数寄存器传递,没有可用的参数寄存器时通过栈进行传递;若为是,通过栈进行传递;3)从第一个可变参数开始遍历参数,根据参数的存放位置获取参数并根据参数大小更新得到下一个参数的存放位置,直至获取得到所有的可变参数。本发明专利技术具有实现方法简单、操作便捷、硬件资源利用率高、执行效率高、灵活性强的优点。

【技术实现步骤摘要】
一种面向可变参函数的编译实现方法
本专利技术涉及高级语言编译器领域,尤其涉及一种面向可变参函数的编译实现方法。
技术介绍
可变参函数是一类特殊的函数,其函数声明中除了包含至少一个固定参数以外,还包含尚未确定的其它参数,而在函数中是通过va_list,va_start,va_arg等关键字来实现参数的迭代和查找。可变参数在格式化输入输出中具有较多的应用,编译器在编译这类函数时,由于不知道具体的参数个数,对可变参数的处理方式和普通函数有很大的区别,编译器需要考虑到可能出现的各种情况,如参数的位置,传参的方式等。要正确的实现可变参函数的编译有以下两个要点:(1)父函数按照正确的规则将参数存放在正确的位置;(2)子函数能够按照一定的规则去正确的位置找到所需要的参数;这两个要点都和参数传递方式以及栈帧存储方式密切相关,而对于不同的体结构来说,参数传递和存储的方式都不一样,因此编译器需要针对特定的体系结构做特定的处理,才能保证正确编译可变参函数。对于可变参函数程序的编译实现,其关键是定义和处理va_list、va_start和va_arg这几个关键字,通常情况下每个上述关键字都需要定义一个相应的本文档来自技高网...
一种面向可变参函数的编译实现方法

【技术保护点】
一种面向可变参函数的编译实现方法,其特征在于,步骤为:(1)第一个可变参数位置确定:获取函数原型中固定参数的个数,并根据固定参数的个数确定第一个可变参数的存放位置,其中当固定参数的个数不超过参数寄存器的数量时,第一个可变参数的存放位置为指定的栈传递参数的起始位置,否则为最后一个固定参数存放位置后的存储单元;(2)参数的传递:读取函数中的参数,根据固定参数个数判断当前参数是否为可变参数,若为否,优先通过参数寄存器传递,没有可用的参数寄存器时通过栈进行传递;若为是,通过栈进行传递并从第一个可变参数存放位置开始依次进行存储;所述步骤(2)的具体步骤为:(2.1)参数类型判断:读取函数中参数,根据固定...

【技术特征摘要】
1.一种面向可变参函数的编译实现方法,其特征在于,步骤为:(1)第一个可变参数位置确定:获取函数原型中固定参数的个数,并根据固定参数的个数确定第一个可变参数的存放位置,其中当固定参数的个数不超过参数寄存器的数量时,第一个可变参数的存放位置为指定的栈传递参数的起始位置,否则为最后一个固定参数存放位置后的存储单元;(2)参数的传递:读取函数中的参数,根据固定参数个数判断当前参数是否为可变参数,若为否,优先通过参数寄存器传递,没有可用的参数寄存器时通过栈进行传递;若为是,通过栈进行传递并从第一个可变参数存放位置开始依次进行存储;所述步骤(2)的具体步骤为:(2.1)参数类型判断:读取函数中参数,根据固定参数个数判断当前参数是否为可变参数,若为是,转入执行步骤(2.2);若为否,转入执行步骤(2.3);(2.2)固定参数的传递:判断当前已传递的固定参数的数目是否大于参数寄存器数量,若为否,当前参数使用参数寄存器来进行传递,若为是,当前参数通过栈来进行传递;(2.3)可变参数的传递:当没有使用栈传递固定参数时,可变参数从指定的栈传递参数的起始位置开始存放;当使用栈传递了固定参数时,可变参数从最后一个固定参数存放位置后的连续空间依次存放;(3)参数的查找:从第一个可变参数的存放位置开始遍历参数,根据参数的存放位置获取参数,并根据下一个参数的大小更新得到下一个参数的存放位置,直至获取得到所有的可变参数;所述步骤(1)的具体步骤为:(1.1)获取函数原型中固定参数...

【专利技术属性】
技术研发人员:王霁孙海燕阳柳张雪萌陈书明郭阳刘衡竹陈跃跃龚国辉李灿陈伟业
申请(专利权)人:中国人民解放军国防科学技术大学
类型:发明
国别省市:湖南,43

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1