asmlinkage 的作用

asmlinkage 的定义(/usr/include/asm/linkage.h里面):

#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))

attribute是关键字,是gcc的C语言扩展,regparm(0)表示不从寄存器传递参数

如果是_attribute_((regparm(3))),那么调用函数的时候参数不是通过栈传递,而是直接放到寄存器里,被调用函数直接从寄存器取参数。

主程序在调用子程序之前,必须要吧需要子程序处理的原始数据传递给子程序,即为子程序准备入口参数。
常见的的参数传递有4种
1.寄存器法
寄存器法就是将入口参数和出口参数存放在约定的寄存器中。
优点:数据传递书读快、编程较方便、节省内存单元。
缺点:当传递参数过多时候(PS:参数大于4个时,必须使用堆栈法),由于寄存器个数有限,及寄存器的频繁使用,将导致寄存器不足。
适用:参数较少的子程序

2。约定单元法:
约定单元法顾名思义是吧入口参数和出口参数都放在事先约定好的单元中
优点:不占用寄存器、参数个数任意、每个子程序要处理的数据和送出的结构都有独立的存储单元
缺点:但用一定数量的存储单元,增加编程中对变量定义的难度

3.堆栈法
堆栈法是利用堆栈来传递参数的。
优点:参数不占用寄存器,和存储单元。参数存放在公共堆栈区,处理完后客恢复。参数个数一般不限
缺点:由于参数和子程序混杂在一起,存取参数时候必须小心计算它在堆栈中的位置。要注意断点的保存和恢复。

4.地址表法
这种方法是把参数组成的一张参数表放在某个存储区中,然后只要主程序和子程序约定好这个存储区的首地址和存放的内容,在主程序中将参数传递给地址表,在子程序中根据地址表给定的参数就可以完成操作。

c、pascal等采用堆栈法传递参数
当汇编语言编写的程序要调用其他语言编写的子程序代码时候,或为其他语言提供子程序模块时候,汇编语言编写的程序必须遵守对应的高级语言的参数传递规则。改原则在汇编语言和其他语言混编时候必须遵守

当然也可以考虑在这个统一的处理的时候,把参数全部按照一定的规范放到寄存器。 但这个方法不能在所有的cpu架构上面都做的到。

我觉得这里的选择,“统一”要比这个“寄存器传参”要重要。 从用户切换到内核,要做大量的处理。相比较其他部分,这点参数的开销实在不算什么。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值