【发布时间】:2015-04-05 17:02:30
【问题描述】:
我有这个小 C 代码
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 decode.c 将其编译为目标文件,然后使用 objdump -M intel -d decode.o 转储该对象,等效的汇编代码是
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
我注意到它根本不使用堆栈。但是首先仍然需要将值加载到寄存器中。所以我的问题是如何将参数加载到寄存器中?编译器会自动将参数加载到幕后的寄存器中吗?还是发生了其他事情?因为没有将参数加载到寄存器中的指令。
还有一点离题。当您增加对编译原始源代码和机器代码之间关系的优化时,会增加将机器代码与源代码相关联的难度。默认情况下,如果您没有为 GCC 指定优化标志,它不会优化代码。因此,我尝试在不进行任何优化的情况下进行编译以从源代码中获得预期的结果,但我得到的是与源代码无关且易于理解的 4-5 倍大的机器代码。但是当我应用 1 级优化时,代码看起来可以理解并且与源代码相关。但为什么呢?
【问题讨论】:
-
不要同时问两个问题。
-
@EOF 是的,我知道,前 6 个 int 或 ptr 参数被传递给寄存器。但我不明白怎么做?我的意思是寄存器不能填满来自空中的数据,传递必须转换为一些机器代码,或者我非常缺少一些东西?
-
@simple16 当参数在堆栈上时,您认为它们来自哪里?您认为堆栈中充满了来自空气的数据吗?当参数由寄存器传递时,值来自完全相同的位置。
-
@PascalCuoq 哦,现在我明白了将参数加载到寄存器的指令发生在调用者中。 :)
标签: c gcc assembly operating-system cpu-architecture