注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

AMD64上 gcc 生成函数的代码使用寄存器传递参数的情况  

2009-05-11 18:20:29|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

64位的cpu除了以前的32位 eax, ebx等寄存器 变成rax ,rbx等64位的寄存器之外,还多加了r8~r15 这个8个通用寄存器,在intel的手册上有说明。
寄存器更多了,gcc生成的代码也可以更多的使用寄存器来传递参数一获取更好的性能。以前记得一般都是在堆栈里面传递的。
不使用 -O2 -O3等优化选项编译出来的 很多也都是采用寄存器来传递参数的了。下面的是个简单的例子,其他的也可以自己写个简单的测试,再看一下汇编代码。

---------------------------------------
#include<stdio.h>
#include<string.h>

int test(int a ,int b , int c, int d , int e, int f, int g, int h)
{
return 0;
}
int main(void)
{
test( 1, 2, 3,4,5,6,7,8);

printf ("\ntrue\n");
return 0;
}
---------------------------------------
gcc -S main.c 编译得到一下汇编代码

        movl    $8, 8(%rsp)
    movl    $7, (%rsp)     从第7个参数开始使用堆栈传递了
    movl    $6, %r9d
    movl    $5, %r8d
    movl    $4, %ecx
    movl    $3, %edx       第3个参数
    movl    $2, %esi       第二个参数
    movl    $1, %edi      可能int还是用的 32位,所以这里是edi 而不是rdi
    call    test

  评论这张
 
阅读(570)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017