我自己在C中编写了一个函数,用于计算给定步数的积分:
double integr(double start, double end, unsigned int steps){
double integral = 0,
currentStep = start;
double step = (end-start)/steps,
halfStep = 1/2*step;
while(currentStep <= end){
integral += 1/(currentStep+halfStep)*step;
currentStep += step;
}
return integral;
}
然后我用gcc反编译它,这就是我留下的东西:
.global integr
integr:
pushq %rbp
movq %rsp, %rbp
movsd %xmm0, -40(%rbp)
movsd %xmm1, -48(%rbp)
movl %edi, -52(%rbp)
movl $0, %eax
movq %rax, -32(%rbp)
movq -40(%rbp), %rax
movq %rax, -24(%rbp)
movsd -48(%rbp), %xmm0
movapd %xmm0, %xmm1
subsd -40(%rbp), %xmm1
movl -52(%rbp), %eax
testq %rax, %rax
js .L2
cvtsi2sdq %rax, %xmm0
jmp .L3
.L2:
#
movq %rax, %rdx
shrq %rdx
andl $1, %eax
orq %rax, %rdx
cvtsi2sdq %rdx, %xmm0
addsd %xmm0, %xmm0
.L3:
divsd %xmm0, %xmm1
movapd %xmm1, %xmm0
movsd %xmm0, -16(%rbp)
movsd -16(%rbp), %xmm1
xorpd %xmm0, %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -8(%rbp)
jmp .L4
.L5:
movsd -24(%rbp), %xmm0
addsd -8(%rbp), %xmm0
movsd .LC1(%rip), %xmm1
divsd %xmm0, %xmm1
movapd %xmm1, %xmm0
mulsd -16(%rbp), %xmm0
movsd -32(%rbp), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, -32(%rbp)
movsd -24(%rbp), %xmm0
addsd -16(%rbp), %xmm0
movsd %xmm0, -24(%rbp)
.L4:
movsd -48(%rbp), %xmm0
ucomisd -24(%rbp), %xmm0
jae .L5
movq -32(%rbp), %rax
movq %rax, -64(%rbp)
movsd -64(%rbp), %xmm0
popq %rbp
ret
.LC1:
.long 0
.long 1072693248
我知道第一行和第二行正在推送旧堆栈指针并移动一个新指针。耦合下一行是获取参数(开始,结束,步骤)并将它们移动到堆栈上。
据我所知,Testq为我们提供了一个信息,如果%rax&lt; 0
我无法找出其他线路的用途。 请帮帮我