博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
__attribute__((regparm(n)))
阅读量:2457 次
发布时间:2019-05-11

本文共 766 字,大约阅读时间需要 2 分钟。

GCC中可以使用__attribute__((regparm(n)))指定最多可以使用n个寄存器(eax, edx, ecx)传递参数,n的范围是0~3,超过n时则将参数压入栈中(n=0表示不用寄存器传递参数)。

看下面例子,函数p1约定不使用寄存器传递参数,尽管只有1个参数,仍然将参数压入栈中。

函数p2约定最多可使用3个寄存器传递参数,因为输入参数有4个,所以前三个使用寄存器传递,最后一个压入栈中。

int q = 5;

int t1 = 1;
int t2 = 2;
int t3 = 3;
int t4 = 4;
#define REGPARM3 __attribute((regparm(3)))
#define REGPARM0 __attribute((regparm(0)))
void REGPARM0 p1(int a)
{
    q = a + 1;
}
void REGPARM3 p2(int a, int b, int c, int d)
{
    q = a + b + c + d + 1;
}
int main(void) {
    p1(t1);
004013ce:   mov 0x402004,%eax
004013d3:   mov %eax,(%esp)
004013d6:   call 0x40138c <p1>
    p2(t1, t2, t3, t4);
004013db:   mov 0x402010,%ebx
004013e1:   mov 0x40200c,%ecx
004013e7:   mov 0x402008,%edx
004013ed:   mov 0x402004,%eax
004013f2:   mov %ebx,(%esp)
004013f5:   call 0x40139a <p2>
    return 0;
}

转载地址:http://tuphb.baihongyu.com/

你可能感兴趣的文章
owncloud_本周热门文章5:ownCloud创始人专访,Raspberry Pi上的Docker等
查看>>
前5名:来自Docker CEO的一句话,来自Scratch的Linux等
查看>>
开源意义_有用的陌生人和开源的意义
查看>>
最佳 开源 人脸识别算法_2014年最佳开源教程
查看>>
foss测试_2014年FOSS十大法律发展
查看>>
本周最热门的5篇文章:Raspberry Pi A +,Ansible和Jen的Linux历程
查看>>
owncloud_一周前五篇文章:Linux理念,ownCloud集成等
查看>>
最佳 开源 人脸识别算法_本周最佳5篇文章:今年最佳开源,以及更多
查看>>
firefox 开源_一周最热门的5篇文章:移动版Firefox OS和年度开源奇迹
查看>>
18年开源前端框架排名_2014年排名前20位的开源故事
查看>>
十大开源项目_2014年十大开源访谈
查看>>
展望2019年_感谢您创纪录的一年(并展望2015年)
查看>>
go开源项目整理-新手篇_一周的前5篇文章:您正在从事什么开源项目?
查看>>
您不懂JavaScript,但您应该
查看>>
医疗项目 开源_免费和开源医疗保健成功的背后是什么?
查看>>
开源教学系统_通过开源进行教学和口语学习
查看>>
命令行python路径命令_探索命令行英雄中Python的过去,现在和未来
查看>>
Codethink开源是入职流程的一部分
查看>>
kubernetes 集群_使用k9s加速Kubernetes集群的管理
查看>>
fsf不推荐debian_FSF揭示了他们用于聊天,视频等的工具
查看>>