这是我的源代码 a.c :
#include <stdio.h>
#include <time.h>
#define N 1000
int p[N] = {0};
int a[N] = {0};
void main(){
long int i;
int acc;
time_t t_start, t_end;
for(i = 0; i < N; ++i){
a[i] = i;
}
t_start = clock();
acc = p[0] = a[0];
for(i = 1; i < N; ++i){
acc = acc + a[i];
p[i] = acc;
}
t_end = clock();
printf("%d\ntime: %f ms\n", p[N - 1], ((double)t_end - t_start) * 1000 / CLOCKS_PER_SEC);//output the result of p[999] and the execution time
return;
}
我用gcc -S命令创建 a.s :
.file "a.c"
.globl p
.bss
.align 32
.type p, @object
.size p, 4000
p:
.zero 4000
.globl a
.align 32
.type a, @object
.size a, 4000
a:
.zero 4000
.section .rodata
.LC2:
.string "%d\ntime: %f ms\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $32, %rsp
movq $0, -24(%rbp)
jmp .L2
.L3:
movq -24(%rbp), %rax
movl %eax, %edx
movq -24(%rbp), %rax
movl %edx, a(,%rax,4)
addq $1, -24(%rbp)
.L2:
cmpq $999, -24(%rbp)
jle .L3
call clock
movq %rax, -16(%rbp)
movl a(%rip), %eax
movl %eax, p(%rip)
movl p(%rip), %eax
movl %eax, -28(%rbp)
movq $1, -24(%rbp)
jmp .L4
.L5:
movq -24(%rbp), %rax
movl a(,%rax,4), %eax
addl %eax, -28(%rbp)
movq -24(%rbp), %rax
movl -28(%rbp), %edx
movl %edx, p(,%rax,4)
addq $1, -24(%rbp)
.L4:
cmpq $999, -24(%rbp)
jle .L5
call clock
movq %rax, -8(%rbp)
cvtsi2sdq -8(%rbp), %xmm0
cvtsi2sdq -16(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd .LC0(%rip), %xmm1
mulsd %xmm1, %xmm0
movsd .LC1(%rip), %xmm1
divsd %xmm1, %xmm0
movl p+3996(%rip), %eax
movl %eax, %esi
movl $.LC2, %edi
movl $1, %eax
call printf
nop
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.section .rodata
.align 8
.LC0:
.long 0
.long 1083129856
.align 8
.LC1:
.long 0
.long 1093567616
.ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
.section .note.GNU-stack,"",@progbits
我注意到一些有趣的代码行从 .L5 :
开始.L5:
movq -24(%rbp), %rax
movl a(,%rax,4), %eax
addl %eax, -28(%rbp)
movq -24(%rbp), %rax
movl -28(%rbp), %edx
movl %edx, p(,%rax,4)
addq $1, -24(%rbp)
似乎-28(%rbp)无用。
所以,我做了一些这样的调整:
.L5:
movq -24(%rbp), %rax
movl a(,%rax,4), %eax
addl %eax, %edx
movq -24(%rbp), %rax
movl %edx, p(,%rax,4)
addq $1, -24(%rbp)
我使用原始 a.s 创建的 a1.out ,并使用我修改的 a.s 文件 a2.out 。
然后我执行了 a1.out 和 a2.out 。
让我感到惊讶的是,我得到了完全不同的结果[999] !!!
我错过了什么吗?
感谢您的帮助。