【发布时间】:2012-06-08 20:26:45
【问题描述】:
我编译了以下C代码:
typedef struct {
long x, y, z;
} Foo;
long Bar(Foo *f, long i)
{
return f[i].x + f[i].y + f[i].z;
}
使用命令gcc -S -O3 test.c。这是输出中的 Bar 函数:
.section __TEXT,__text,regular,pure_instructions
.globl _Bar
.align 4, 0x90
_Bar:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
leaq (%rsi,%rsi,2), %rcx
movq 8(%rdi,%rcx,8), %rax
addq (%rdi,%rcx,8), %rax
addq 16(%rdi,%rcx,8), %rax
popq %rbp
ret
Leh_func_end1:
我有几个关于这个汇编代码的问题:
- 如果函数体中既没有使用
rbp,也没有使用rsp,那么“pushq %rbp”、“movq %rsp, %rbp”和“popq %rbp”的用途是什么? - 为什么
rsi和rdi自动包含C 函数的参数(分别为i和f)而不从堆栈中读取它们? -
我尝试将 Foo 的大小增加到 88 个字节(11 个
longs)并且leaq指令变成了imulq。将我的结构设计为具有“更圆”的大小以避免乘法指令(以优化数组访问)是否有意义?leaq指令被替换为:imulq $88, %rsi, %rcx
【问题讨论】:
标签: c optimization gcc x86 x86-64