首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数参数加载到x64上的寄存器

函数参数加载到x64上的寄存器
EN

Stack Overflow用户
提问于 2015-02-05 17:53:11
回答 1查看 270关注 0票数 0

我有一个小小的C代码

代码语言:javascript
复制
void decode(int *xp,int *yp,int *zp)
{
      int a,b,c;
      a=*yp;
      b=*zp;
      c=*xp;
      *yp=c;
      *zp=a;
      *xp=b;
}

然后,我使用gcc -c -O1 decde.c将其编译成对象文件,然后用objdump -M intel -d decde.o转储对象,其等效汇编代码为

代码语言:javascript
复制
mov ecx,DWORD PTR [rsi]
mov eax,DWORD PTR [rdx]
mov r8d,DWORD PTR [rdi]
mov DWORD PTR [rsi],r8d
mov DWORD PTR [rdx],ecx
mov DWORD PTR [rdi],eax
ret

我注意到它不使用all.But上的堆栈,首先,仍然需要将值加载到寄存器中。所以我的问题是,如何将参数加载到寄存器中?编译器是否在幕后自动将参数加载到寄存器中?或者发生了其他事情?,因为没有指令将参数加载到寄存器中。

还有一点离题。当您增加编译原始源代码和机器代码之间关系的优化时,就会减少,这就增加了将机器代码与源代码联系起来的差异。默认情况下,如果您不为GCC指定优化标志,它就不会优化代码。因此,我试图在没有任何优化的情况下编译,以便从源代码中获得预期的结果,但我得到的机器代码是源代码的4-5倍,这些代码与源代码无关,也是可以理解的。但是当我应用第1级优化时,代码看起来是可以理解的,并且与源代码相关。但是为什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-05 18:20:48

参数被加载到调用方的寄存器中。示例:

代码语言:javascript
复制
int a;
int b;

int f(int, int);

int g(void) {
  return f(a, b);
}

查看为g生成的代码

代码语言:javascript
复制
$ gcc -O1 -S t.c
$ cat t.s
…
movl    b(%rip), %esi
movl    a(%rip), %edi
call    f

第二个问题:

因此,我试图在没有任何优化的情况下编译,以便从源代码中获得预期的结果,但我得到的机器代码是源代码的4-5倍,这些代码与源代码无关,也是可以理解的。

这是因为未优化的代码是愚蠢的。它是中间表示的直接转换,其中每个变量都存储在堆栈中,即使不需要,每个转换也由显式操作表示,即使不需要一个变量,等等。-O1是读取生成的程序集的最佳优化级别。此外,还可以禁用帧指针,这会使简单函数的开销降到最低。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28350773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档